쉘 변수의 내용을 그대로 보려면 어떻게 해야 합니까?

쉘 변수의 내용을 그대로 보려면 어떻게 해야 합니까?

터미널 이스케이프 코드가 포함된 데비안의 쉘 변수의 내용을 그대로 보고 싶습니다. echo내용을 확인하려고 하면 모든 터미널 이스케이프가 터미널에 의해 해석되어 색상을 표시합니다.

➜  sds git:(master) echo $PS1
%(?:%{%}➜ :%{%}➜ ) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)

쉘 변수의 내용을 그대로 인쇄할 수 있습니까? 아니면 내용을 그대로 보려면 변수를 설정하는 정확한 스크립트를 찾아야 합니까?

답변1

처럼테르돈 라고, 다른 변수의 값을 사용하여 변수를 구성한 경우 해당 변수의 원래 구성을 되돌릴 수 없습니다.

그러나 적어도 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. 터미널에서 해석된 이스케이프가 없으며 옵션 이 설정되어 있다고 가정하면 프롬프트를 표시하는 데 사용될 때 확장됩니다 . 하지만 확장될 때는 그렇지 않습니다.fgreset_colorpromptsubstPS1echo $PS1

답변2

변수의 내용에는 사용 중인 모든 변수의 확장된 값이 포함됩니다. 원본은 값을 확장하는 데에만 사용되므로 원본으로 돌아갈 수 없습니다.

예를 들어 다음을 고려하십시오.

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

셸이 설정될 때 이미 로 설정되어 있지 않고 로 설정되어 있습니다 barVar. 로 돌아갈 수 있는 방법이 없습니다. 변수 는 새 변수에 값으로 할당되기 전에 확장되었습니다 . 결국 변수 사용의 요점은 변수를 값으로 취급할 수 있다는 것입니다.$foovarbarVar$fooVar : barfoo : bar"$fooVar : bar"$vooVarbarVar

따라서 아니요, 이미 확장하고 사용한 "확장되지 않은" 변수를 병 속에 다시 넣을 수 있는 방법은 없습니다. 어떤 변수가 사용되었는지 확인하는 유일한 방법은 해당 변수가 PS1있는 다양한 파일을 추적하는 것입니다. 세트.

관련 정보