Linuxコマンドインタープリターであるシェルの場合、これらの余分な文字は画面スペースの無駄ではありません。 彼らはさまざまな情報を結び付け、以前は堅実だったものを共有し、さらに多くのことを行うことができる強力なチームです。 シェルの最も単純で同時に強力な機能の1つは、標準の入力/出力ストリームのリダイレクトです。
3つの標準入出力ストリーム
ここで説明する内容を理解するには、リダイレクト可能なデータの送信元と送信元を知ることが重要です。 Linuxには、3つの標準入力/出力データストリームがあります。
最初は標準入力ストリームです。 システムでは、これはフロー#0です(コンピューターでは通常、スコアは最初から始まるため)。 スレッド番号は記述子とも呼ばれます。 このストリームは、端末に送信される情報、特に実行のためにシェルに送信される命令を表します。 通常、キーボードからのユーザー入力中にデータがこのストリームに分類されます。
2番目のストリームは標準出力ストリームであり、番号1が割り当てられています。これは、何らかのアクションを実行した後にシェルが表示するデータストリームです。 通常、これらのデータは、コマンドが入力された端末の同じウィンドウに表示され、表示されます。
最後に、3番目のストリームは標準エラーストリームであり、ハンドル2があります。このストリームは、通常は端末画面に表示されるため、標準出力ストリームに似ています。 ただし、基本的には標準出力とは異なるため、これらのフローは必要に応じて個別に制御できます。 これは、たとえば次の状況で役立ちます。 大量のデータを処理し、複雑でエラーが発生しやすい操作を実行するチームがあります。 このコマンドが生成する有用なデータがエラーメッセージと混ざらないことが必要です。 これは、出力ストリームとエラーを個別にリダイレクトすることで実現されます。
おそらく既に推測したように、I / Oのリダイレクトとは、上記のフローを操作し、プログラマが必要な場所にデータをリダイレクトすることを意味します。 これは、シンボル
>
および
<
をさまざまな組み合わせで使用して行われます。これらの使用は、最終的にリダイレクトされたデータがどこに行くかによって異なります。
標準出力のリダイレクト
現在の日付と時刻が書き込まれるファイルを作成するとします。 ポイントは、必要なものを返す
date
という名前のコマンドが存在するという事実によって単純化されています。 通常、コマンドはデータを標準出力に出力します。 このデータをファイルに含めるには、コマンドの後に、ターゲットファイルの名前の前に
>
記号を追加する必要があります。 前後にスペースを入れます。
リダイレクトを使用する場合、
>
後に指定されたファイルはすべて上書きされます。 ファイルに貴重なものがなく、その内容が失われる可能性がある場合は、既存のファイルをデザインで使用することは許可されています。 通常、この場合、まだ存在しないファイルの名前を使用することをお勧めします。 このファイルはコマンドの後に作成されます。
date.txt
と呼び
date.txt
。 通常、一定期間後のファイル拡張子は特別な役割を果たしませんが、拡張子は順序を維持するのに役立ちます。 だからここに私たちのチームがあります:
$ date > date.txt
これは、このチーム自体が非常に有用であると言っているわけではありませんが、それに基づいて、私たちはすでにもっと面白いことをすることができます。 インターネットを経由して特定のエンドポイントに到達するトラフィックのルートがどのように変化しているかを調べ、対応するデータを毎日記録したいとします。
traceroute
チームは、この問題の解決に役立ちます。この問題は、コマンドがURLの形式で呼び出されたときに指定されたコンピューターとエンドポイント間のトラフィックルートに関する詳細を提供します。 データには、トラフィックが通過するすべてのルーターに関する情報が含まれます。
すでに日付のあるファイルがあるので、
traceroute
から受け取ったデータをこのファイルに添付するだけで
traceroute
です。 これを行うには、2つの文字
>
使用して、次々に配置する必要があります。 その結果、出力をファイルにリダイレクトするが、上書きせず、古いデータの後に新しいデータを追加する新しいコマンドは次のようになります。
$ traceroute google.com >> date.txt
ここで、
mv
コマンドを使用して、ファイル名をより意味のある名前に変更する必要があります
mv
コマンドは、最初の引数として元のファイル名を渡し、2番目として新しいファイル名を渡します。
$ mv date.txt trace1.txt
標準入力ストリームのリダイレクト
>
記号の代わりに
<
を使用すると、標準入力をリダイレクトして、ファイルの内容に置き換えることができます。
list1.txt
と
list2.txt
2つのファイルがあり、それぞれに文字列のソートされていないリストが含まれているとします。 各リストには固有の要素がありますが、リスト内の要素の一部は同じです。 最初のリストと2番目のリストの両方にある行を見つけるには
comm
コマンドを使用しますが、使用する前にリストをソートする必要があります。
ソートされたデータを取得元のファイルに保存せずに、ソートされたリストを端末に返す
sort
コマンドがあります。
>
コマンドを使用して各リストのソートされたバージョンを新しいファイルに送信してから、
comm
コマンドを使用できます。 ただし、このアプローチでは少なくとも2つのコマンドが必要になりますが、不要なファイルを作成せずに1行で同じことができます。
したがって、
<
コマンドを使用して、各ファイルのソートされたバージョンを
comm
コマンドにリダイレクトできます。 取得したものは次のとおりです。
$ comm <(sort list1.txt) <(sort list2.txt)
ここでの括弧の意味は数学と同じです。 シェルは最初にコマンドを括弧内に処理し、次に他のすべてを処理します。 この例では、最初にファイルの行をソートし、次に何が起こったのかを
comm
コマンドに渡し、リストの比較結果を表示します。
標準エラーストリームのリダイレクト
最後に、標準エラーストリームのリダイレクトについて説明します。 これは、たとえば、エラーログファイルを作成したり、エラーメッセージとデータコマンドによって返されたデータを1つのファイルにまとめるために必要になる場合があります。
たとえば、スーパーユーザー権限を持たないユーザーが利用できるワイヤレスインターフェイスに関する情報をシステム全体で検索する必要がある場合はどうなりますか? これを行うには、強力な
find
使用できます。
通常、通常のユーザーがシステム全体で
find
実行すると、有用なデータとエラーが端末に表示されます。 同時に、通常は前者よりも後者のほうが多く、コマンドの出力で必要なものを見つけるのが難しくなります。 この問題の解決は非常に簡単です。2>コマンドを使用して標準エラーストリームをファイルにリダイレクトするだけです(2は標準エラーストリームハンドルです)。 その結果、コマンドが標準出力に送信するもののみが画面に表示されます。
$ find / -name wireless 2> denied.txt
このデータをエラー情報と混合せずに、コマンドの結果を別のファイルに保存する必要がある場合はどうなりますか? ストリームは互いに独立してリダイレクトできるため、構築の最後に、標準出力ストリームをファイルにリダイレクトするコマンドを追加できます。
$ find / -name wireless 2> denied.txt > found.txt
最初の山かっこには番号
2>
が付いており、2番目の山かっこには番号がないことに注意してください。 これは、標準出力に記述子1があり、
>
コマンドは、記述子番号が指定されていない場合に標準出力をリダイレクトすることを意味するためです。
そして最後に、コマンドが出力するすべてを1つのファイルにまとめたい場合、
&>
コマンドを使用して両方のスレッドを同じ場所にリダイレクトできます。
$ find / -name wireless &> results.txt
まとめ
ここでは、Linuxコマンドラインインタープリターのスレッドリダイレクトメカニズムの基本のみを検討しましたが、今日学んだことはほとんど無限の可能性を提供します。 ちなみに、ターミナルでの作業に関係する他のすべてと同様に、フローリダイレクトをマスターするには練習が必要です。 したがって、
>
および
<
して独自の実験を開始することをお勧めします。
親愛なる読者! Linuxでスレッドリダイレクションを使用する興味深い例を知っていますか?これは、初心者が端末で作業するというこのトリックをよりよく始めるのに役立ちますか?