쉘에서 동등한 표현

쉘에서 동등한 표현

파이썬에서는 다음을 사용합니다:

repr('test')

출력을 얻으려면 :

"'test'"

나는 동일한 작업을 수행하고 싶지만 이 값을 변수에 저장할 수 있도록 셸에서 수행하고 싶습니다. 어떻게 해야 하나요?

예를 들면 다음과 같습니다. 명령을 실행하면 다음과 같습니다.

echo $test

나는 출력을 얻습니다 :

ghjghj "' bhj ""'' bjhv "''hjuhd

쉘에서는 다음을 수행하고 싶습니다.

test=repr(repr($test))

답변1

Python과 유사한 것은 stdout 대신 다른 변수로 "인쇄"하는 것과 결합될 수 있다는 것 repr입니다 . (비표준이지만 bash 및 zsh의 내장 printf에서는 지원됩니다):printf %qprintf -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 -pbash에서도 사용 가능) 리터럴이 아닌 변수에서만 작동합니다.

[prompt] typeset -p foo
declare -- foo="'\"'<>\\\`'\"'''()*@@@@\$\$\$\$\`\`\`\`'''''"
[prompt]

의 대안으로 printf %q최신 버전의 bash에는 ${var@Q}특별한 확장 형식도 있습니다.

[bash] echo "${foo@Q}"
''\''"'\''<>\`'\''"'\'''\'''\''()*@@@@$$$$````'\'''\'''\'''\'''\'''

관련 정보