파이썬에서는 다음을 사용합니다:
repr('test')
출력을 얻으려면 :
"'test'"
나는 동일한 작업을 수행하고 싶지만 이 값을 변수에 저장할 수 있도록 셸에서 수행하고 싶습니다. 어떻게 해야 하나요?
예를 들면 다음과 같습니다. 명령을 실행하면 다음과 같습니다.
echo $test
나는 출력을 얻습니다 :
ghjghj "' bhj ""'' bjhv "''hjuhd
쉘에서는 다음을 수행하고 싶습니다.
test=repr(repr($test))
답변1
Python과 유사한 것은 stdout 대신 다른 변수로 "인쇄"하는 것과 결합될 수 있다는 것 repr
입니다 . (비표준이지만 bash 및 zsh의 내장 printf에서는 지원됩니다):printf %q
printf -v
[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
( declare -p
bash에서도 사용 가능) 리터럴이 아닌 변수에서만 작동합니다.
[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]
의 대안으로 printf %q
최신 버전의 bash에는 ${var@Q}
특별한 확장 형식도 있습니다.
[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''