Что это означает в оболочке, когда мы помещаем команду в знак доллара и круглые скобки: $(команда)
Я просто хочу понять следующую строку кода в оболочке. Он используется для получения текущего рабочего каталога. Я знаю, что имя $(variable)
возвращает значение внутри имени переменной, но что должно возвращать $(command)
? Возвращает ли значение после выполнения команды? В этом случае мы можем использовать `
для выполнения команды.
CWD="$(cd "$(dirname $0)"; pwd)"
Такой же вывод можно взять из следующей строки кода также в другой версии оболочки
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Я не могу понять значения $(cd..
и $(dirname
.
Может ли кто-нибудь помочь мне разобраться, как эта команда выполняется?
Ответы
Ответ 1
Использование $
как ${HOME}
дает значение HOME. Использование $
как $(echo foo)
означает запустить все, что находится внутри круглых скобок в подоболочке, и вернуть это значение. В моем примере вы получите foo
, так как echo
будет писать foo
до стандартного
Ответ 2
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Could anybody help me to figure out how this command get executed?
Давайте посмотрим на разные части команды. BASH_SOURCE
- это переменная массива bash, содержащая исходные имена файлов. Таким образом, "${BASH_SOURCE[0]}"
вернет вам имя файла script.
dirname
- это утилита GNU coreutils, которая удаляет последний компонент из имени файла. Таким образом, если вы выполните script, сказав bash foo
, "$( dirname "${BASH_SOURCE[0]}" )"
вернет .
. Если вы сказали bash ../foo
, он вернул бы ..
; для bash /some/path/foo
он вернет /some/path
.
Наконец, вся команда "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
получает абсолютный каталог, содержащий вызываемый script.
$(...)
позволяет подмену команды, то есть позволяет выводить команду на замену самой команды и может быть вложенной.