2016-11-13 6 views
7

関数の補完をファイルに出力したいと思います。 Iは、上記指示に基づいて、その命令に続くされるコマンドのprintf「%のQ」、bashでprintf "%q"を使うには?

# man printf 
%q  ARGUMENT is printed in a format that can be reused as shell input, escaping non-print‐ 
      able characters with the proposed POSIX $'' syntax. 

を言われた、私は、次のコードを試みました。

#!/bin/bash 
# file name : print_out_function_augs.sh 

output_file='output.txt' 

function print_augs() { 
    printf "%q " "[email protected]" >> "${output_file}" 
    echo >> "${output_file}" 
} 

print_augs a 'b c' 

cat "${output_file}" 
rm "${output_file}" 

及び結果は以下の通りである

bash print_out_function_augs.sh 

を実行し、

a b\ c 

Iはprint_augs機能元のオーグメントある

a 'b c' 

ような結果を期待。

出力と元の機能が異なるのはなぜですか? オリジナルのオーグメントをそのまま印刷することはできますか?

ありがとうございました。心の中で

答えて

6

ベアこの%qを使用した:

引数はが提案POSIX $「」の構文で出力できない文字をエスケープし、シェルの入力として再利用できるフォーマットで印刷されます。

強調鉱山。 printfは、入力がシェルで再利用できる限り、のように引数を再フォーマットすることが自由です。しかし、これはあなたの意見がそうであるように見える理由ではありません。

Bashの'文字は文字列区切り文字です。これはbashに「次の文字列にはスペースなどの特殊文字が含まれており、これらの特殊文字はBashで解析されるべきではありません。引用符は、呼び出されるコマンドに渡されません。それを囲む引用符を持っていない

Command: 
    printf "%q" a 'b c' 

Received args: 
    printf::arg0: printf 
    printf::arg1: %q 
    printf::arg2: a 
    printf::arg3: b c 

arg3こと:どのようなコマンドを見ていると、このようなものです。 Bashはそれらを渡しません。

printfはそれがb c前後に引用符があったことを知らないので、それはそれらを印刷しない、を引数を出力します。しかし、 'b'と 'c'の間のスペースは特別なシェル文字で、それをエスケープするには\を前に置くことがわかります。

これはすべてのbash関数/コマンドに当てはまりますので、print_augsにも同じことが起こることに注意してください。

あなたは、文字列の前後に引用符を維持したい場合は、バッシュは、それらを解析しないように、それらを引用倍にする必要があります:

function print_augs2() { 
    echo "[email protected]" >> "${output_file}" 
} 

print_augs2 a "'b c'" 

# Output: a 'b c' 
+0

は、詳細な説明と解決策をありがとうございました。私は 'b \ c'で '\'を想像することができませんでした。エスケープ文字です。 – mora

関連する問題