bash プログラムを作成するときは、通常、次のような呼び出しを作成します。
declare -a mycmd=( command.ext "arg1 with space" arg2 thing etc )
"${mycmd[@]}" || echo "Failed: foo"
die foo
出力して終了する bash 関数はどこにありますかError foo
。
しかし、エラーの理由を明確にしたい場合は、失敗したコマンドを出力します。
"${mycmd[@]}" || echo "Failed: foo: ${mycmd[*]}"
したがって、ユーザーはデッド コマンドを実行して、その理由を突き止めることができます。ただし、このパスでは引用符が失われます。スペースまたはエスケープ文字を含む Failed メッセージ引数は、カットアンドペーストして実行できる方法で出力されません。
この問題を解決するためのコンパクトな方法についての提案はありますか?
問題は、bash がコマンドの引数解析を処理する方法と、(組み込みの) echo が引数を処理する方法だと思います。問題を述べる別の方法は次のとおりです。
次の bash の例 (即時モードではなく、スクリプトとして実行する必要があります) で、スペースを含む引数の周りに引用符を出力するにはどうすればよいですか?
#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
実結果:
1 2 3 4
1 2 3 4
望ましい結果
1 2 3 4
1 2 "3 4"
また
1 2 3 4
"1" "2" "3 4"
いくつかの追加の bash コード文字で。
質問は閉じられました: @camh は見事に答えました:
更新されたスクリプト:
#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
echo $(printf "'%s' " "${myargs[@]}")
出力:
1 2 3 4
1 2 3 4
'1' '2' '3 4'