Как я могу увидеть дословное содержимое переменной оболочки?

Ну, я чувствую себя немного глупо, но… демон bluetooth просто не работал !

Итак, я решил это с помощью:

systemctl enable bluetooth

Вуаля!

3
21.11.2020, 11:38
2 ответа

Как Тердонговорит , вы не можете вернуться к исходной конструкции переменной, если она была построена с использованием значений других переменных.

Однако вы можете увидеть его содержимое, не интерпретируемое терминалом или даже самой оболочкой, по крайней мере, в Bash и Zsh:

printf '%q\n' "$PS1"

Это позволит экранировать все символы, которые в противном случае имели бы другой эффект; вы можете использовать это, чтобы восстановить дословное содержание.

Другой подход состоит в том, чтобы вывести содержимое переменной куда-нибудь, кроме терминала (напрямую ); например

printf %s "$PS1" | od -vtc

покажет содержимое переменной, символ за символом, заменив управляющие символы мнемоникой (nl, esc, sp... ).

Не не используйте здесь echo, который расширяет \xпоследовательности и добавляет дополнительный символ новой строки.

В вашем случае

%(?:%{%}➜ :%{%}➜ ) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)

похоже, что это может быть в точности дословное содержимое вашей PS1переменной :там нет терминальных -интерпретируемых escape-последовательностей, они получены косвенно через массив fgи переменную reset_color. Предполагая, что опция promptsubstустановлена, они будут расширены, когда PS1используется для отображения подсказки, но не при расширении echo $PS1.

4
18.03.2021, 22:48

Содержимое переменной включает расширенные значения всех используемых вами переменных. Вы не можете вернуться к оригиналу, потому что оригинал используется только для расширения значений.

Например, рассмотрим это:

fooVar="foo"
barVar="$fooVar : bar"

К тому времени, когда оболочка схватывается barVar, она уже расширяется $foovar. Он не устанавливает barVarна $fooVar : bar, он устанавливает его на foo : bar. Вернуться к "$fooVar : bar"невозможно, переменная $vooVarбыла расширена перед присвоением значения новой переменной barVar. В этом весь смысл использования переменных, ведь :их можно рассматривать как их значение.

Итак, нет никакого способа загнать джина обратно в бутылку и «нерасширить» переменные, которые вы уже расширили и использовали. Единственный способ увидеть, какие переменные использовались для формирования вашего PS1, — это отследить различные файлы, в которых он устанавливается.

4
18.03.2021, 22:48

Теги

Похожие вопросы