PS1 = '$ (pwd)', чому це працює і чому це відрізняється від PS1 = $ (pwd)


18

Чому при введенні цієї команди підказка змінює свій каталог?

PS1='$(pwd)'

Я використовую одинарні лапки, а це означає, що немає інтерполяції, а також echo '$(pwd)'—— →$(pwd)

Крім того, скажіть, що ми уточнили, чому це працює ... чому воно працює інакше PS1=$(pwd)? (котирування взагалі немає)

Я по-різному маю на увазі, що якщо я буду використовувати лапки, то підказка буде постійно змінюватися в моєму поточному каталозі, коли я переходжу через термінал. Але якщо я не використовую лапки, то підказка завжди залишатиметься каталогом, в якому я був, коли я вперше входив у командуPS1=$(pwd)

чому?


2
Збережіть кілька циклів процесора та використовуйте еквівалент PS1 = '$ PWD'
jlliagre

Відповіді:


29

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

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

Значення Aодразу стає рядком, /home/yourusernameі, очевидно, воно не запам’ятовується, звідки походить цей рядок, воно залишається таким же, навіть якщо ви зміните каталог. Значення B, однак, стає буквальним рядком $(pwd)без інтерпретації.

Тепер у значенні PS1чогось особливого трапляється: кожного разу, коли друкується запит, трактуються певні спеціальні конструкції, наприклад, підміна команд $(...)виконується саме так, як це сталося вище при призначенні Aзмінної. Очевидно, що якщо у вас PS1є буквальна рядок вашого домашнього каталогу (як це було описано вище A), то це не може змінитись. Але якщо він містить рядок $(pwd)(як було зазначено вище B), він оцінюється кожного разу, коли надруковано запит і, отже, відобразиться фактичний каталог.


14

І в bash, і в zsh значення PS1не використовується як підказка як є, воно зазнає певних розширень. Ці правила відрізняються для двох оболонок, але в обох випадках одна з кроку полягає у виконанні «долар» розкладання (змінна підстановки, підстановки команд, арифметична оцінка) з таким же синтаксисом , як і в звичайному синтаксисі оболонки ( , , або , , ) .$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • В основному, розширення долара включено за замовчуванням, але його можна вимкнути за допомогою shopt -u promptvars.
  • У zsh, розширення долара вимкнено за замовчуванням, але багато людей (і більшість конфігураційних систем, які ви знайдете в Інтернеті) включають його setopt prompt_subst.

Увімкнення розширення долара у запиті PS1='$(pwd)'встановлює PS1значення 6 символів $(pwd)і, таким чином, призводить $(pwd)до заміни, і, отже, pwdкоманда, яка виконується, щоразу, коли оболонка відображає нове запит. З іншого боку, PS1=$(pwd)встановлює PS1будь-який поточний робочий каталог оболонки на той час. Якщо у вас була вимкнена розширення долара, то PS1='$(pwd)'це призведе до того, що підказкою буде буквальний рядок $(pwd).

Зауважте, що існують більш зручні способи отримання робочого каталогу в підказці:

  • В bash, із зворотним косою рисою, такою як \w, яка скорочує ваш домашній каталог ~і може бути оброблена налаштуваннями PROMPT_DIRTRIM.
  • У zsh із відсотковим пробігом, таким як %/або%~ ( %/те саме $PWD, що %~скорочує домашні каталоги), який може мати налаштування обрізки.
  • І в оболонці (і в будь-якій іншій оболонці в стилі Борна) $PWDеквівалентно $(pwd): вам не потрібно запускати підпроцес, щоб отримати поточний робочий каталог.

7

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.