Python에서는 다음을 사용합니다.
repr('test')
출력을 얻으십시오 :
"'test'"
나도 똑같은 일을 하고 싶지만 셸에서는 값을 변수에 저장할 수 있습니다. 어떡해?
예를 들어 다음 명령을 실행하면 다음과 같습니다.
echo $test
나는 출력을 얻습니다 :
ghjghj "' bhj ""'' bjhv "''hjuhd
쉘에서는 다음을 수행하고 싶습니다.
test=repr(repr($test))
답변1
Python 과 유사하게 repr
이는 stdout 대신 다른 변수로 "인쇄"하는 것과 결합 printf %q
될 수 있습니다. printf -v
(표준은 아니지만 bash 및 zsh printf 내장 기능이 지원합니다):
[prompt] foo=$(cat <<'EOT'
'"'<>\`'"'''()*@@@@$$$$````'''''
EOT
)
[prompt] printf '%q\n' "$foo"
\'\"\'\<\>\\\`\'\"\'\'\'\(\)\*@@@@\$\$\$\$\`\`\`\`\'\'\'\'\'
[prompt] printf -v bar %q "$foo"
실제 용도 중 하나는 여러 SSH를 통해 명령을 전달하려는 경우입니다(예: 다음을 ssh -J
사용하여 중간 호스트에서 전달을 설정할 수 없는 경우).하나(적어도 나에게는) 추적하기에는 이스케이프 레벨이 너무 많습니다.
[prompt] cmd='echo "$USER'\''s \$HOME on $HOSTNAME is $HOME"'
[prompt] ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
[prompt] printf -v cmd %q "$cmd"
[prompt] ssh localhost ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
[prompt] printf -v cmd %q "$cmd"
[prompt] printf -v cmd %q "$cmd"
[prompt] printf -v cmd %q "$cmd"
[prompt] echo "$cmd"
echo\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\$USER\\\\\\\\\\\\\\\'s\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$HOME\\\\\\\\\\\\\\\ on\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\$HOSTNAME\\\\\\\\\\\\\\\ is\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\$HOME\\\\\\\\\\\\\\\"
# OK, we're ready to go
[prompt] ssh localhost ssh localhost ssh localhost ssh localhost ssh localhost "$cmd"
luser12's $HOME on kgbvax is /home/luser12
그러나 이는 원격 셸에서 지원되지 않을 수 있는 따옴표 이스케이프 형식을 printf %q
사용합니다.$'...'
(비록 bash, zsh 등에서 지원되며 POSIX 표준의 향후 버전에 포함될 것으로 예상됩니다.)
Bash와 ksh93에도 이 기능이 있지만 typeset -p
(bash처럼 사용할 수도 있음 declare -p
) 리터럴이 아닌 변수에서만 작동합니다.
[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]
대안으로 printf %q
최신 버전의 bash에는 ${var@Q}
특별한 확장 형식도 있습니다.
[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''