Я просто хочу понять следующую строку кода в оболочке. Он используется для получения текущего рабочего каталога. Я знаю, что $(variable)
имя возвращает значение внутри имени переменной, но что $(command)
должно возвращать? Возвращает ли значение после выполнения команды? В этом случае мы можем использовать `
для выполнения команды.
CWD="$(cd "$(dirname $0)"; pwd)"
Тот же вывод можно получить из следующей строки кода также в другой версии оболочки.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Я не могу понять значение $(cd..
и $(dirname
.
Может ли кто-нибудь помочь мне выяснить, как выполняется эта команда?
$()
vs``
.: stackoverflow.com/questions/9449778/…Ответы:
Использование
$
подобного${HOME}
дает значение HOME. Использование$
подобного$(echo foo)
означает запускать все, что находится в круглых скобках в подоболочке, и возвращать это как значение. В моем примере вы получите,foo
посколькуecho
напишетеfoo
в стандартный форматисточник
$(...)
- лучший способ написать команду, чем пытаться использовать обратные кавычки. Подумайте о письме:gcclib=$(dirname $(dirname $(which gcc)))/lib
используйте обратные кавычки. Еще до того, как вы столкнетесь с трудностями, связанными с выполнением этого в Markdown, это сложнее, потому что вам нужно избегать обратных кавычек во вложенных командах, тогда как вы этого не делаете с$(...)
обозначениями.$(echo foo)
создает подстановку команд, а не подоболочку. Другой текущий ответ дает это право. Я думаю, что подстановка команд выполняется как бы в подоболочке, но это все же разные концепции.$(echo foo)
попытается запустить то, что возвращается из круглых скобок, она сначала запустится, аecho foo
затем попытается запустить,foo
что выдает ошибкуДавайте посмотрим на разные части команды.
BASH_SOURCE
- это переменная массива bash, содержащая имена исходных файлов. Так"${BASH_SOURCE[0]}"
что вернет вам имя файла сценария.dirname
это утилита, предоставляемая GNU coreutils, которая удаляет последний компонент из имени файла. Таким образом, если вы выполните свой сценарий, сказавbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
вернется.
. Если бы вы сказалиbash ../foo
, это вернется..
; ибоbash /some/path/foo
он вернется/some/path
.Наконец, вся команда
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
получает абсолютный каталог, содержащий вызываемый скрипт.$(...)
позволяет подстановку команд, т. е. позволяет выводить команду вместо самой команды и может быть вложенным.источник
dirname
возвращает путь к исполняемому файлу (относительный или абсолютный по отношению к текущему рабочему каталогу ),cd
изменяет pwd на этот каталог иpwd
распечатывает абсолютный путь к текущему рабочему каталогу. Но почему к ним присоединились&&
? А чтоDIR
удержит, еслиcd
не удастся?&&
предотвращаетpwd
запуск в случаеcd
сбоя, так чтоDIR
он будет пустым, а не иметь неправильный каталог.