5

不要な置換をトリガーするグロビング (ファイル名補完) 用に予約された文字を含むシェル変数 (BASH) を使用する最もエレガントな方法は何ですか? 次に例を示します。

for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done

ファイル名には「[」や「]」などの文字が含まれています。私は基本的に2つのアイデアを持っています:

1) set -f でグロビングをオフにします: 別の場所で必要です

2) ファイル内のファイル名をエスケープします。BASH は、標準入力にパイプするときに「ファイルが見つかりません」と文句を言います。

任意の提案のためのThx

編集:欠落している唯一の答えは、ファイル名がシェル変数「$file」にある場合にグロビングに使用される特殊文字を含む名前のファイルから読み取る方法です。たとえば、command1 <「$file」です。

4

3 に答える 3

9

親シェルの環境はこれによってまったく影響を受けないため、set -fとを切り替える代わりに、サブシェルset +fに単一を適用することもできます。set -f

(
set -f
for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done
)


# or even

sh -f -c '
   for file in $(cat files); do
      command1 < "$file"
      echo "$file"
   done
'
于 2013-01-18T16:20:17.153 に答える
5

でグロビングをオフにしてset -fから、後でスクリプトで を使用してオンに戻すことができますset +f

于 2012-05-04T17:47:50.520 に答える
2

while read代わりに使用してください。

cat files | while read file; do
    command1 < "$file"
    echo "$file"
done
于 2012-05-04T16:18:26.820 に答える