これを行う標準的な方法bash
は次のようなものです
unset args
while IFS= read -r line; do
args+=("$line")
done < file
cmd "${args[@]}"
または、bashのバージョンが次の場合mapfile
:
mapfile -t args < filename
cmd "${args[@]}"
mapfileとwhile-readループとone-linerの間で見つけられる唯一の違い
(set -f; IFS=$'\n'; cmd $(<file))
前者は空行を空の引数に変換しますが、1行は空行を無視します。この場合、ワンライナーの動作はとにかく私が好むものなので、それがコンパクトであることの二重のボーナスです。
使用しますIFS=$'\n' cmd $(<file)
が、機能しません。$(<file)
コマンドラインを形成する前に解釈されるため、IFS=$'\n'
有効になります。
それは私の場合は仕事をしませんが、私は今、ツールの多くが持つ終端ラインをサポートすることを学んだnull (\000)
の代わりにnewline (\n)
、これらの状況の一般的な供給源であるこれを簡単に対処する、たとえば、ファイル名、の多くを作るんいるが:
find / -name '*.config' -print0 | xargs -0 md5
完全修飾ファイル名のリストを、グロビングや補間などを行わずにmd5の引数としてフィードします。それは非組み込みソリューションにつながります
tr "\n" "\000" <file | xargs -0 cmd
ただし、これも空白行のみを無視しますが、空白のみの行をキャプチャします。