Чи краще використовувати $ (pwd) або $ PWD?


35

Я зіткнувся BASEDIR=$(pwd)в сценарії.

Чи є якісь переваги чи недоліки щодо використання BASEDIR="$PWD", крім, можливо, того, що $PWDможна було б перезаписати?


3
трохи інформації на unix.stackexchange.com/a/79621
Stéphane Chazelas

@ StéphaneChazelas Дуже цікаво написати. Я лише на півдорозі і продовжу, але, наскільки я це зрозумів, краще використовувати $(pwd), тому що $PWDможе застаріти за певних обставин.
Мінікс

2
лише в деяких оболонках (не, наприклад, bash, dash, zsh чи ksh93) pwdпотенційно ви отримаєте менше застійної інформації, ніж $PWDу деяких кутових випадках. $(pwd)з іншого боку, не працює, якщо поточний каталог закінчується символами нового рядка, означає розблокувати процес (за винятком ksh93) та використовувати додаткові ресурси. За мою думку , використання $PWDв $(pwd -P)це не варто використовувати $(pwd).
Stéphane Chazelas

1
в нижній частині там стефан згадує використання cd -P -- "$dir". якщо є сумніви щодо цінності, $PWDви завжди можете cd -P .першими. це також може бути корисним тим, що ви також отримаєте все, що $PWDбуло раніше, $OLDPWDі тому зможете порівняти їх згодом - і наступна cd ...; cd -послідовність обов'язково поверне вас туди, де ви зараз знаходитесь.
mikeserv

Відповіді:


41

Якщо bash наштовхнеться, $(pwd)він виконає команду pwd та замінить $(pwd)її вихідною командою. $PWD- це змінна, яка майже завжди встановлюється. pwd - це вбудована команда оболонки з давніх часів.

Таким чином $PWD, не вдасться, якщо ця змінна не встановлена, і $(pwd)вийде з ладу, якщо ви використовуєте оболонку, яка не підтримує $()конструкцію, що, на мій досвід, досить часто буває. Тому я б скористався $PWD.

Як і кожен ботанік, у мене є власний підручник із сценаріїв оболонок


6
У мене було враження, що `command`синтаксис є небажаним і $(command)його слід віддавати перевагу. Наскільки мені відомо, остання сумісна з POSIX, але я не впевнений на 100%.
Мінікс

6
@Minix $()Дійсно визначено POSIX, тому поза попереднім POSIX, /bin/shдоступним для Solaris 10 та старшими cshоболонками, я сумніваюся, що в багатьох інших оболонках основної мети немає цієї функції.
jlliagre

@Minix: Ось нещодавнє запитання на цьому веб-сайті, яке ілюструє одну проблему із використанням задників замість$()
PM 2Ring

правильно, замість $ () ви можете використовувати зворотні посилання, але це не буде каскадно, тому я не згадував про це
Thorsten Staerk,

1
Хороший
мінімап

6

Слід також зазначити, що $PWDбажано через його виконання. Як змінна оболонки, її можна вирішити майже миттєво. $(pwd)трохи заплутаніше. Якщо ви оглянете man 1 bulitinв системі Bash, ви побачите, що pwdце вбудована команда, яка може змусити вас повірити, що це буде так само швидко, як і доступ до змінної. Однак $()конструкція завжди запускає нову підзарядку (новий процес) для запуску її вмісту, незалежно від того, що знаходиться всередині. Те ж саме стосується і задньої бази. Дійсно, коли я його орієнтую:

echo 'Benchmarking $(pwd)...'
time (for i in {1..1000}; do echo $(pwd) > /dev/null; done)
echo 'Benchmarking $PWD...'
time (for i in {1..1000}; do echo $PWD > /dev/null; done)

Я отримую 1,52 секунди за $(pwd)дзвінок і 0,018 секунди за $PWD. Потрібно уникати непотрібного запуску підрозділів, а також будь-яких інших сторонніх процесів, коли це можливо. Вони набагато дорожчі, ніж функціональні дзвінки, до яких можна звикнути іншими мовами.


Це цікаво сприйняти це, але я не знаю, чи мене турбує ефективність моїх скриптів оболонки. Мені також цікаво, як буде змінюватися продуктивність, якщо pwd зміниться між запитами до нього.
Мінікс

@Minix Я змінив сценарій, щоб тіло циклу було echo $PWD; pushd ..; echo $PWD; popd(з додатковим >/dev/nullпісля кожного заяви), і це займе 0,05 секунди. Потім я видалив повідомлення ехо (лише pushd / popd), і це зайняло 0,03. Таким чином, час на кожен echo $PWDбув ще 0,01 секунди. Я робив щось подібне з $(pwd), і це займало 2,2 секунди на кожен цикл, так що 1,1 секунди за $(pwd)виклик.
markasoftware

Не бути надто прискіпливим, але я можу уявити, що обчислення, які замінять $PWD, будуть здійснюватися на задньому плані перед оцінкою ехо-заяв. Але очевидно, що доступ до $PWDнього все-таки значно швидший, тому якщо сумісність не викликає побоювань, це, безумовно, є причиною вибрати один за іншим. Дякую за роботу над тестуванням цього. :)
Minix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.