
AWSを読んでいます。eic_harvest_hostkeys
スクリプト、次の行を理解できません。
key=$(/usr/bin/awk '{$1=$1};1' < "${file}")
awkの利点は何ですか?もっと良くないですかkey=$(/bin/cat "${file}")
?
答え1
key=$(/bin/cat "${file}")
key
改行なしでファイルの内容に設定します。 (ヌルバイトではなくテキストファイルであると仮定します。)
key=$(/usr/bin/awk '{$1=$1};1' < "${file}")
水平スペースの正規化:各行の先頭と末尾からスペースとタブを削除し、内部スペースとタブ順序を単一のスペースに圧縮します。$1=$1
うまくいかないようですが、実際には、awkに更新されたフィールドに基づいて行を書き換えさせ、行を書き換えると、フィールドの周りの空白情報が削除されます。その後、末尾の改行文字も削除します。
¹ $file
aで始まらない場合は、オプションパラメータとして扱われます-
。cat
使用する方が良いでしょうkey=$(cat < "$file")
(key=$(cat -- "$file")
また改善されますが、file='-'
それでも問題です)。
答え2
入力行を標準形式に強制的に$1
書き換える割り当て。awk
{ echo 'one two three'; echo ' indented with trailing '; } | cat
one two three
indented with trailing
{ echo 'one two three'; echo ' indented with trailing '; } | awk '{$1=$1}; 1'
one two three
indented with trailing
また、ダッシュfile=-x
で始まるファイル名を参照するとkey=$(<"$file")
正しく機能しますが、多くの(すべて?)実装の場合key=$(cat "$file")
と同様にエラーが発生します。cat: unknown option -- x
cat
答え3
でもこれも長すぎます。ただし:
[m/n/g]awk NF=NF
NF
左側の最初の引用符はシェルが等号=
で何もしないようにするため、シェルレベルでは引用符は必要ありません。