Eu gostaria de colocar este comando em um arquivo para ser executado posteriormente:
ln -s "$xr"/ya.txt ~
Eu posso fazer isso com (1):
cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof
ou (2):
printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh
ou (3):
echo "ln -s '$xr'/ya.txt ~" > zu.sh
ou (4):
printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh
ou (5):
printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"
no entanto, cada solução é problemática. se a variável em (1) ou (2) contiver aspas duplas, elas falharão; se a variável em (3) contiver uma aspa simples, ela falhará. (4) é bom, mas não é definido pelo POSIX . (5) é bom, mas é um bashismo . parece que a melhor opção seria usar (1) ou (2) e escapar de aspas duplas na variável, mas isso pode ser feito de outra maneira?
Eu acho que isso é seguro:
Ele coloca aspas simples na string, de modo que qualquer
$
,`
,\
, e"
na string de entrada não importem , e transforma todos os'
caracteres existentes em'"'"'
(ou seja, aspas simples finais, aspas duplas em aspas simples e, em seguida, reinsira aspas simples ).Era tentador usar a
$(...)
substituição de comando lá, exceto que então ele consumiria todas as novas linhas à direita na entrada. Em vez disso, as aspas de abertura e fechamento são inseridas pelossed
próprios segundo e terceiro scripts, no início da primeira linha e no final da última linha. Quaisquer novas linhas incorporadas são deixadas brutas, o que é bom.A saída é adequada para copiar de volta para o shell, mesmo no caso mais patológico que eu possa inventar (usando aspas Bash ANSI-C
$'...'
para criar a string de teste em primeiro lugar, mas não depois):É seguro colocar isso em uma variável
xr=$(esc "$xr")
e, em seguida, usá-lo em uma substituição comum mais tarde em seu documento aqui ou em outro lugar.