2013-06-03 9 views
0

Когда я устанавливаю свой PS1 = '$ PWD', в командной строке отображается путь к текущему каталогу: /home/myname, и он изменяется при изменении каталога.Одиночные/двойные кавычки ksh

Но когда я меняю его на «$ PWD» (двойные кавычки), он всегда показывает мне/home/myname независимо от того, где я нахожусь. Из того, что я прочитал, он говорит, что одинарные кавычки печатают именно то, что в нем есть, и не расширяют специальные символы, такие как $. Так почему это так работает?

ответ

1

«$ PWD» разрешается немедленно. Таким образом, вы по существу устанавливаете PS1 на фиксированное значение (значение PWD в момент его установки). Когда вы устанавливаете значение «$ PWD», оно не разрешается немедленно, поэтому оно разрешается при использовании и изменяется при изменении каталогов. Таким образом, двойные кавычки расширяются (до фиксированной строки), как ожидалось, а одинарные кавычки - нет.

+0

Да, но почему в учебниках говорится, что одинарные кавычки печатают точно, что в них? Итак, «$ PWD» должен печатать «$ PWD»? – CuriousGuy

+0

Одиночные кавычки предотвращают разрешение относительно текущей оболочки/команды, в то время как двойные кавычки допускают разрешение в текущей оболочке/команде. Текущая команда/команда «устанавливает значение переменной PS1», а не последующие операции оболочки, которые считывают значение. Использование двойных кавычек подобно буквальному написанию «set PS1 =/a/b/c», который фиксируется. Использование одинарных кавычек говорит: «Не разрешайте значение во время команды set», что приводит к его разрешению позже при использовании для отображения вашего приглашения, поэтому оно изменяется. – user1676075

0

PS1 - специальная переменная. На странице руководства пользователя ksh:

PS1 The value of this variable is expanded for parameter expansion, 
     command substitution, and arithmetic substitution to define the 
     primary prompt string which by default is ``$''. [...] 

Таким образом, значение PS1 получает специальную обработку перед отображением приглашения. При использовании одинарных кавычек, значение PS1 просто строка $PWD , но когда требуется подсказка, КШ будет еще больше расширяет переменный, поэтому подсказка получает текущего каталог.