Что это означает в оболочке, когда мы помещаем команду в знак доллара и круглые скобки: $(команда)

Я просто хочу понять следующую строку кода в оболочке. Он используется для получения текущего рабочего каталога. Я знаю, что имя $(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.

$(...) позволяет подмену команды, то есть позволяет выводить команду на замену самой команды и может быть вложенной.