コマンドの変数置換をプレビューするにはどうすればよいですか?

コマンドの変数置換をプレビューするにはどうすればよいですか?
u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE

結果のコマンドを実行する代わりに、簡単に(たとえば、可能であればエスケープせずに)印刷したいと思います。

bash のようなデフォルトの Linux シェルでこの種のテストを実行するための組み込み機能はありますか?

答え1

一般的なケースを処理するには、変数を引用符で囲み、コマンドを配列として保存する必要があります。

$ 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 

コマンド配列を実行するには:

"${command[@]}"

echoこのコマンドは、非常に単純なケースでは機能します。

echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE

これは最も簡単な解決策ですが、展開に空白文字 (具体的にはスペース、タブ、改行) やエスケープ文字などの特殊文字が含まれていない場合にのみ、正しい出力が表示されます。例:

$ USER='foo bar'
$ echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
u2api --zuser=foo bar --outfmtput=json SQL create_database name=

ユーザー名の周りの引用符がないことに注意してください。引用符で囲まれていない空白を含む変数でも同じ問題が発生します。

関連情報