Как интерполировать переменную сразу после `$` или `\$` в приглашении bash?

Я использую эту функцию:

function test(){
  local var="hello"
  PS1="\u\$$var"
}

Вывод, который я пытаюсь получить из функции: john$hello,

Но то, что я получаю, это просто john,

Если я добавлю пробел перед $varтогда я подхожу к тому, что хочу, но не хочу места там.

Можно ли делать то, что я хочу, не имея этого места?

1 ответ

Решение

Так как вы использовали двойные кавычки при настройке PS1, подстановка переменной оценивается в точке, где вы назначаете переменную. Итак, вы закончили настройку PS1 в \u$hello, Оболочка раскрывает переменные перед отображением приглашения, и поскольку у вас нет ни одной переменной с именем hello, эта часть приглашения расширяется до пустой строки.

Если вы установите PS1 используя одинарные кавычки, в этой точке замена переменных не будет выполнена. Это приведет к $var часть, которая будет оценена при отображении приглашения, а это означает, что оно не будет выбирать локальную переменную, которую вы определили в вашей функции оболочки.

Третий вариант, который должен работать с локальной переменной из функции оболочки, это экранировать метасимволы:

PS1="\u\\\$$var"

Это должно привести к тому, что PS1 будет установлен на \u\$hello, Конец приглашения не изменится, когда переменная var изменения в этом случае.

Другие вопросы по тегам