Repr-Äquivalent in der Shell

Repr-Äquivalent in der Shell

In Python verwende ich:

repr('test')

um die Ausgabe zu erhalten:

"'test'"

Ich möchte dasselbe tun, aber in der Shell, um diesen Wert in einer Variablen speichern zu können. Wie kann ich das tun?

Beispiel: Wenn ich einen Befehl ausführe:

echo $test

Ich erhalte die Ausgabe:

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

In der Shell möchte ich Folgendes tun:

test=repr(repr($test))

Antwort1

Etwas Ähnliches wie bei Python reprist printf %q, dass „which“ mit „which“ kombiniert werden könnte, printf -vdas in eine andere Variable statt in stdout „druckt“. (Obwohl es nicht standardmäßig ist, wird es im in Bash und Zsh integrierten printf unterstützt):

[prompt] foo=$(cat <<'EOT'
'"'<>\`'"'''()*@@@@$$$$````'''''
EOT
)
[prompt] printf '%q\n' "$foo"
\'\"\'\<\>\\\`\'\"\'\'\'\(\)\*@@@@\$\$\$\$\`\`\`\`\'\'\'\'\'
[prompt] printf -v bar %q "$foo"

Ein praktischer Einsatzzweck hierfür ist, wenn Sie Befehle über mehrere SSHs weitergeben möchten (z. B. wenn Sie die Weiterleitung auf Zwischenhosts nicht mit einrichten können ssh -J) und sogareinsDer Grad der Flucht ist zu groß, um ihn im Auge behalten zu können (zumindest für mich):

[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

Beachten Sie jedoch, dass das Anführungszeichen-Escape-Format printf %qverwendet wird , das von der Remote-Shell möglicherweise nicht unterstützt wird.$'...'(obwohl es von Bash, Zsh usw. unterstützt wird und angeblich in einer zukünftigen Version des POSIX-Standards enthalten sein soll).


Bash und ksh93 haben das auch typeset -p(auch verwendbar wie declare -pin Bash), aber es funktioniert nur mit Variablen, nicht mit Literalen:

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

Alternativ zu printf %qgibt es in neueren Versionen der Bash auch die ${var@Q}spezielle Erweiterungsform:

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

verwandte Informationen