シェル: GNU BASH
私はしばらく次のコマンドを使用してきました。
echo "$(fmt -w 50 < foo.txt)" > foo.txt
問題ありません。しかし試してみるとき:
fmt -w 50 < foo.txt > foo.txt
foo.txtファイルは空のファイルになります。これは、シェルから解析するリダイレクト演算子がサブシェルの優先順位に関連しているためだと思います。
GNU BASH マニュアルを検索しても結果が出ませんでした。マニュアルに何か抜けたのか誰か教えてもらえますか?私はこの動作の原因を理解して、それをさらに活用し、問題を引き起こす可能性があるすべての状況を理解できることを願っています。
ベストアンサー1
Bashのマニュアルでは、3.7.1 簡単なコマンド拡張:
単純なコマンドを実行すると、シェルは左から右に次の拡張、割り当て、およびリダイレクトを実行します。
コマンド置換は、(2) で発生する拡張の 1 つであり、(3) で拡張後にリダイレクトが発生します。これは、サブシェルとは無関係であり、純粋にシェルが操作を実行する順序によるものです。(fmt -w 50 < foo.txt) > foo.txt
空のファイルも作成されます。