Что означает следующее:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Я особенно заинтересован в этой части:
varible=$(...)
Я знаю, что скобки используются для выполнения подпроцесса, но что, если они используются вместе с $?
Что означает следующее:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Я особенно заинтересован в этой части:
varible=$(...)
Я знаю, что скобки используются для выполнения подпроцесса, но что, если они используются вместе с $?
Ответы:
Из руководства 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%/*}"
/bin/shSolaris 10 или более ранней версии ) не поддерживалась $(...).
varible=$(..)Называется подстановки команд , и это означает не более , но запустить команду оболочки и сохранить свой вывод переменной или отображать обратно с помощью эхо - команды. Например, отобразить дату и время:
echo "Today is $(date)"
и для хранения его в переменной:
SERVERNAME=$(hostname)
Для получения дополнительной информации: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bashи ищите подстановку команд