Что это за переменная формы = $ (…)

9

Что означает следующее:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

Я особенно заинтересован в этой части:

varible=$(...)

Я знаю, что скобки используются для выполнения подпроцесса, но что, если они используются вместе с $?

Максим Корецкий
источник
3
Если вы используете bash: загляните в man-страницу через man bashи ищите подстановку команд
FloHe

Ответы:

16

Из руководства Bash ( man bash):

   Подстановка команд
       Подстановка команд позволяет выводу команды заменить
       Название команды Есть две формы:

              $ (Команда)
       или
              `command`

       Bash выполняет расширение, выполняя команду в подоболочке
       окружение и замена подстановки команд стандартными
       вывод команды с удаленными любыми завершающими символами новой строки. внедренный
       переводы строки не удаляются, но они могут быть удалены во время слова
       расщепление. Подстановка команды $ (cat file) может быть заменена на
       эквивалентно, но быстрее $ (<файл).

(Это справедливо для всех Bourne-подобных оболочек, т.е. sh, ksh, zsh, и bashт.д., а zshтакже возможность захвата данных с внедренными символов NUL в этом смысле)

Команда

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

назначит имя директории, в которой расположен скрипт (при этом также изменяя все обратные слэши на прямые косые черты) для переменной basedir. Любые ошибки, предупреждения или другие диагностические сообщения, которые выводятся в стандартный поток ошибок, все равно будут отображаться на терминале ( $(...)захватывает только стандартный вывод команды).

Оболочка начнется с выполнения внутренней подстановки команды:

echo "$0" | sed -e 's,\\,/,g'

Выходные данные этого будут даны как строка для dirname, и выходные данные этого будут назначены переменной basedir.

Двойные кавычки предназначены для того, чтобы гарантировать, что разделение слов или глобализация имени файла не будут выполнены, в противном случае вы можете обнаружить, что сценарий завершается ошибкой или выдает странный вывод, когда $0(имя сценария, включая путь, используемый для его выполнения) содержит пробел символ или символ глобализации имени файла (например, ?или *).

В целом, хорошая идея всегда заключать в кавычки расширения (расширения переменных, подстановки команд и арифметические расширения). Посмотрите этот вопрос и ответы на него, чтобы получить отличное объяснение, почему это хорошая идея.

Если сценарий был выполнен как

$ /usr/local/bin/script.sh

тогда basedirполучит значение /usr/local/bin.

Или на Cygwin:

$ bash c:\\Users\\Me\\script.sh

тогда basedirполучит значение c:/Users/Me. Двойная обратная косая черта в командной строке в этом случае просто для того, чтобы избежать одиночной обратной косой черты из оболочки. Фактическое значение $0является c:\Users\Me\script.sh.

Другой способ сделать то же самое без использования dirname, echoи sedбудет

basedir="${0//\\//}"
basedir="${basedir%/*}"
Кусалананда
источник
спасибо, так что это в основном начинает анализ из самых внутренних скобок, правильно? и почему используются цитаты?
Максим Корецкий
@ Максимус Правильно. Я обновил свой ответ с дополнительной информацией.
Кусалананда
Может быть, вы должны сказать «верно для всех оболочек типа Борна». Немного понятнее
Сергей Колодяжный,
@Serg, обратите внимание, что оболочка Bourne (как в /bin/shSolaris 10 или более ранней версии ) не поддерживалась $(...).
Стефан
@ StéphaneChazelas Я включу это.
Кусалананда
6

Это означает запустить то, что находится внутри скобок в подоболочке, и вернуть это как значение , в вашем случае присвоив его varible.

Марк
источник
5

varible=$(..)Называется подстановки команд , и это означает не более , но запустить команду оболочки и сохранить свой вывод переменной или отображать обратно с помощью эхо - команды. Например, отобразить дату и время:

echo "Today is $(date)"

и для хранения его в переменной:

SERVERNAME=$(hostname)

Для получения дополнительной информации: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

Виссам Ружула
источник