No bash, ksh93 e zsh, você pode usar o escape %q
para o printf
incorporado .
#!/bin/bash
# also works in ksh93, zsh
setup_and_run() {
some_setup_commands
cat >>rerun.sh <<EOF
some_setup_commands
$(printf '%q ' "$@")
EOF
"$@"
}
No bash, você pode usar o printf -v
para gravar a saída em uma variável, e não na saída padrão.
#!/bin/bash
printf -v cmd '%q ' "$@"
setup_and_run() {
some_setup_commands
cat >>rerun.sh <<EOF
some_setup_commands
$cmd
EOF
"$@"
}
No zsh, há um método diferente, que é o q
sinalizador de expansão do parâmetro , seguido de j: :
para unir os elementos da matriz com um espaço.
#!/bin/zsh
setup_and_run() {
some_setup_commands
cat >>rerun.sh <<EOF
some_setup_commands
${(j: :)${(q)@}}
EOF
"$@"
}
Em sh simples, é mais difícil. Uma maneira confiável de citar uma palavra é colocar aspas simples nela e substituir cada uma das citações por '\''
. Fazer a substituição corretamente não é muito fácil, envolvendo uma chamada externa para sed ou um loop.
#!/bin/sh
quote_simple_command () {
quoted=
for raw in "$@"; do
quoted="$quoted'"
while case "$raw" in *\'*) true;; *) false;; esac; do
quoted="$quoted${raw%%\'*}'\''"
raw="${raw#*\'}"
done
quoted="$quoted$raw' "
done
printf %s "${quoted% }"
}
setup_and_run() {
some_setup_commands
cat >>rerun.sh <<EOF
some_setup_commands
$(quote_simple_command "$@")
EOF
"$@"
}