find .
これらのコマンドで入力すること/home/user/*
の違いは何ですかfor
?たとえば、
for var in $(find .)
do echo "$var"
done
または
for var in /home/user/*
do
echo "$var"
done
最初の場合、for
コマンドは名前にスペースを含むファイルを爆発させます。 2番目のケースではそうではありません。なぜ?
ベストアンサー1
これはシェルの標準動作です。作業順序は、コマンドの置換($(find .)
)、単語の分割、グローバル拡張(/home/user/*
)です。
~からPOSIX規格(単語分割 = フィールド分割、グローバル拡張 = パス名拡張):
単語拡張の順序は次のとおりです。
チルダ拡張(チルダ拡張を参照)、パラメータ拡張(パラメータ拡張を参照)、コマンド置換(コマンド置換を参照)、および算術拡張(算術拡張を参照)は、最初から最後まで実行する必要があります。トークン認識のトピック5を参照してください。
IFSが空でない場合は、手順1で作成したフィールド部分に対してフィールド分割を実行する必要があります(フィールド分割を参照)。
set -fが適用されない限り、パス名拡張を実行する必要があります(パス名拡張を参照)。
見積もりの削除(見積もりの削除を参照)は、常に最後に実行する必要があります。
したがって、単語分割がファイル名を妨げないように、可能であれば常にglobを使用することをお勧めします。構成$(find)
は実際には例です。バッシュトラップ #1。