Если вы используете 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будет
varible=$(..)Называется подстановки команд , и это означает не более , но запустить команду оболочки и сохранить свой вывод переменной или отображать обратно с помощью эхо - команды. Например, отобразить дату и время:
man bash
и ищите подстановку командОтветы:
Из руководства Bash (
man bash
):(Это справедливо для всех Bourne-подобных оболочек, т.е.
sh
,ksh
,zsh
, иbash
т.д., аzsh
также возможность захвата данных с внедренными символов NUL в этом смысле)Команда
назначит имя директории, в которой расположен скрипт (при этом также изменяя все обратные слэши на прямые косые черты) для переменной
basedir
. Любые ошибки, предупреждения или другие диагностические сообщения, которые выводятся в стандартный поток ошибок, все равно будут отображаться на терминале ($(...)
захватывает только стандартный вывод команды).Оболочка начнется с выполнения внутренней подстановки команды:
Выходные данные этого будут даны как строка для
dirname
, и выходные данные этого будут назначены переменнойbasedir
.Двойные кавычки предназначены для того, чтобы гарантировать, что разделение слов или глобализация имени файла не будут выполнены, в противном случае вы можете обнаружить, что сценарий завершается ошибкой или выдает странный вывод, когда
$0
(имя сценария, включая путь, используемый для его выполнения) содержит пробел символ или символ глобализации имени файла (например,?
или*
).В целом, хорошая идея всегда заключать в кавычки расширения (расширения переменных, подстановки команд и арифметические расширения). Посмотрите этот вопрос и ответы на него, чтобы получить отличное объяснение, почему это хорошая идея.
Если сценарий был выполнен как
тогда
basedir
получит значение/usr/local/bin
.Или на Cygwin:
тогда
basedir
получит значениеc:/Users/Me
. Двойная обратная косая черта в командной строке в этом случае просто для того, чтобы избежать одиночной обратной косой черты из оболочки. Фактическое значение$0
являетсяc:\Users\Me\script.sh
.Другой способ сделать то же самое без использования
dirname
,echo
иsed
будетисточник
/bin/sh
Solaris 10 или более ранней версии ) не поддерживалась$(...)
.Это означает запустить то, что находится внутри скобок в подоболочке, и вернуть это как значение , в вашем случае присвоив его
varible
.источник
varible=$(..)
Называется подстановки команд , и это означает не более , но запустить команду оболочки и сохранить свой вывод переменной или отображать обратно с помощью эхо - команды. Например, отобразить дату и время:и для хранения его в переменной:
Для получения дополнительной информации: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
источник