
私は以下を読んだ。絵のモア:
簡単な例は、「古い」ファイルの「day」を「new」ファイルの「night」に変更することです。
sed s/day/night/ <old >new
または他の方法(UNIX初心者の場合)、
sed s/day/night/ old >new
著者はなぜ最初の形式がより進化した形式だと思いますか?
つまり、「初心者」構文と比較してこの形式を使用すると、どのような利点がありますか?
答え1
シェルがopen()
同様の操作を実行できるようにするには、次の利点があります。
utility <in >out
名前付きユーティリティが次の操作を実行できるようにする代わりにopen()
:
utility in >out
...ファイル記述子は安全です今後指定されたユーティリティを呼び出します。それ以外の場合、open()
ユーティリティ中にエラーが発生した場合、ユーティリティはまったく呼び出されません。これは競合状態による副作用を防ぐ最良の方法です。これは使用時に時々起こります。小川そしてストリームエディタ。
リダイレクトが失敗すると、シェルはユーティリティへの呼び出しを短絡し、stderrにエラーメッセージを記録します。シェル一時的にユーティリティに渡すのではなく、stderr(まあ、これはリダイレクトのコマンドラインの順序によって異なります)- 標準診断フォーマットを使用してください。ファイルを開くことができるかどうかをテストする最も簡単な方法は、ファイルを開いて<
他の操作を実行する前に暗黙的にこれを行うことです。
おそらくあなたの質問のコマンドに表示される最も明白な競争条件は次のとおりです。出るリダイレクト。どちらの形式でも、シェルは書き込みを開く>
ことも実行します。sed
これは、2番目の形式で読み取るためにファイルを正常に開くことができるかどうかに関係なく発生します。だから出る切り捨てられ、おそらく不要かもしれません。入力を正常に開くことができる場合にのみ出力に書き込もうとする場合は、悪いことがあります。ただし、最初のフォームで行ったように、常に入力を最初に開くと問題はありません。
そうでなければ少なくとも10数値として参照されるファイル記述子は、シェルリダイレクト構文を使用してこの方法で操作でき、これらの組み合わせは少し面倒です。
また、シェルがオープン操作を実行すると、ディスクリプタは呼び出されたコマンド(2番目のバージョンと同じ)に属さずにシェルに属し、呼び出されたコマンドはそれを継承します。これは同じ複合コマンド内で呼び出される他のコマンドと同じ方法で継承されるため、コマンドはこの方法で入力を共有できます。
答え2
sed
STDINとパラメータを介してファイルを処理します。
最初の形式では、入力リダイレクト演算子を使用してsed s/day/night/ <old
STDINを介してファイルの内容を渡します。old
sed
2番目の形式では、sed s/day/night/ old
ファイル名を引数として渡すだけですsed
。
どちらも正確で同じ出力を生成します。
著者が意味するのは、標準ストリームとその機能、リダイレクト演算子を正しく使用する方法に慣れていない場合、新しいユーザーが最初のストリームに慣れるのが少し難しいことです。しかし、これは私の意見だけです。作者が何をしているのかはわかりません。