Я столкнулся BASEDIR=$(pwd)
в сценарии.
Есть ли какие-либо преимущества или недостатки по сравнению с использованием BASEDIR="$PWD"
, которые $PWD
могут быть перезаписаны?
shell-script
pwd
Minix
источник
источник
$(pwd)
, потому что$PWD
в определенных обстоятельствах может устареть.pwd
потенциально вы получите менее устаревшую информацию, чем$PWD
в некоторых угловых случаях.$(pwd)
с другой стороны, не работает, если текущий каталог оканчивается символами новой строки, означает разветвление процесса (кроме ksh93) и использование дополнительных ресурсов. По моему мнению , использование$PWD
в$(pwd -P)
это не стоит использовать$(pwd)
.cd -P -- "$dir"
. если есть какие-либо сомнения в ценности,$PWD
вы всегда можетеcd -P .
сначала. это также может быть полезным в том смысле, что вы также получаете то, что$PWD
было до этого,$OLDPWD
и поэтому можете сравнить их потом - и следующаяcd ...; cd -
последовательность наверняка вернет вас туда, где вы сейчас находитесь.Ответы:
Если bash встретится,
$(pwd)
он выполнит команду pwd и заменит$(pwd)
выходные данные этой команды.$PWD
переменная, которая почти всегда установлена. PWD давно является встроенной командой оболочки.Так что
$PWD
произойдет сбой, если эта переменная не установлена, и$(pwd)
произойдет сбой, если вы используете оболочку, которая не поддерживает$()
конструкцию, что, как мне кажется, довольно часто. Так что я бы использовал$PWD
.Как и у каждого ботаника, у меня есть свой учебник по написанию сценариев оболочки
источник
`command`
синтаксис был нежелателен и$(command)
должен быть предпочтительным. Насколько я знаю, последний совместим с POSIX, но я не уверен на 100%.$()
Действительно определяется POSIX, поэтому за пределами предварительной версии POSIX,/bin/sh
доступной в Solaris 10 и более ранних версиях иcsh
производных оболочках, я сомневаюсь, что во многих других общедоступных оболочках эта функция отсутствует.$()
Также следует упомянуть, что
$PWD
желательно из-за его производительности. Как переменная оболочки, она может быть решена практически мгновенно.$(pwd)
немного более запутанным. Если вы проверяетеman 1 bulitin
систему с помощью Bash, вы увидите, чтоpwd
это встроенная команда, которая может заставить вас поверить, что она будет такой же быстрой, как и доступ к переменной. Однако$()
конструкция всегда запускает новый подоболочек (новый процесс) для запуска своего содержимого, независимо от того, что находится внутри. То же самое касается спины. Действительно, когда я оцениваю это:Я получаю 1,52 секунды за
$(pwd)
звонок и 0,018 секунды за$PWD
. По возможности следует избегать ненужного запуска подоболочек, а также любых других посторонних процессов. Они намного дороже, чем вызовы функций, к которым вы можете привыкнуть на других языках.источник
echo $PWD; pushd ..; echo $PWD; popd
(с дополнительным>/dev/null
после каждого оператора), и это занимает 0,05 секунды. Затем я удалил операторы echo (только pushd / popd), и это заняло 0,03. Таким образом, время заecho $PWD
все еще было 0,01 секунды или около того. Я сделал что-то подобное с$(pwd)
, и это заняло 2,2 секунды для каждого цикла, так что 1,1 секунды на$(pwd)
вызов.$PWD
было бы быть заменено, было бы выполнено в фоновом режиме до оценки операторов echo. Но очевидно, что доступ$PWD
по-прежнему значительно быстрее, поэтому, если совместимость не является проблемой, это определенно является причиной выбора одного над другим. Спасибо за тщательную работу по тестированию. :)