u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Eu gostaria de imprimir facilmente (por exemplo, sem escapar, se possível) o comando resultante em vez de executá-lo.
Existe algum recurso interno para fazer esse tipo de teste em shells padrão do Linux como bash?
Responder1
Para lidar com o caso geral você deve citar variáveis e armazenar o comando como um array:
$ USER='foo bar' DATABASE='baz ban'
$ command=(u2api --zuser="$USER" --outfmtput=json SQL create_database name="$DATABASE")
$ printf '%q ' "${command[@]}"; echo # To get a newline at the end
u2api --zuser=foo\ bar --outfmtput=json SQL create_database name=baz\ ban
Para executar a matriz de comando:
"${command[@]}"
echo
O comando funciona em alguns casos muito simples:
echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
Esta é a solução mais simples, mas só mostra a saída correta se as expansões não contiverem caracteres especiais, como espaço em branco (espaço, tabulação ou nova linha, especificamente) ou caracteres de escape. Por exemplo:
$ USER='foo bar'
$ echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
u2api --zuser=foo bar --outfmtput=json SQL create_database name=
Observe as aspas ausentes ao redor do nome de usuário. Você terá o mesmo problema com quaisquer variáveis não citadas que contenham espaços em branco.