1. 序章

Linuxコマンドラインで作業するときはいつでも、findの結果のリストをgrepにフィードするように、あるコマンドから別のコマンドにデータを渡さなければならないことがよくあります。 ここでストリームが機能します。

このチュートリアルでは、ストリームとは何か、およびストリームをどのように操作するかを見ていきます。

2. ストリームとは何ですか?

最も単純な形式のストリームは、あるポイントから別のポイントにデータ(特に文字データ)を運ぶパイプと考えることができます。

入力ストリームの例としては、キーボード、ファイルに保存されたテキストデータ、およびI/Oデバイスからの入力があります。 出力をファイル、コマンド、ウィンドウ、およびその他のI/Oデバイスに配信できます。

3. サンプルデータ

以降のセクションで使用するサンプルファイルをいくつか作成してみましょう。

$ echo -e "tables\nladders\nchairs" > streamdata1
$ echo -e "planes\ntrains\nautomobiles" > streamdata2

streamdata1およびstreamdata2ファイルを作成し、それらにいくつかのデータを入力しました。

$ cat streamdata1
tables
ladders
chairs

$ cat streamdata2 
planes
trains
automobiles

4. 入力のリダイレクト

最初に確認するストリームはSTDINです。

STDINは標準の入力ストリームを参照します。 通常、キーボードから入力します。 STDIN のファイルハンドルは0(ゼロ)です。

The <演算子は入力を渡すために使用されますファイルまたはI/Oデバイスデータからコマンドに

wc コマンドのパラメーターとしてファイル名を渡さずに、ファイルの行数をカウントしたいとします。 STDINをリダイレクトすることでそれを行うことができます:

$ wc -l < streamdata1

5. 出力のリダイレクト

次に、見てみましょう STDOUT、標準出力ストリーム。 このストリームからのすべての出力は、通常、ターミナルウィンドウに送信されます。 STDOUTのファイルハンドルは1です。

>演算子は、出力をコマンドからソースに送信するために使用されます。 通常はファイルです。 デフォルトでは、単一の>は次のようになります。

  • まだ存在しない場合は、新しいファイルを作成します
  • ファイルがすでに存在する場合は、ファイル内の既存のデータを上書きします

catコマンドを使用してstreamdata1の内容を出力し、出力を新しいファイルに送信する方法を見てみましょう。

$ cat streamdata1 > combinedstreamdata

combinestreamdata ファイルの内容を印刷すると、streamdata1のようになります。

$ cat combinedstreamdata
tables
ladders
chairs

6. 既存のファイルに追加する

> はデータを上書きしますが、 >>演算子は、既存のファイルに追加してデータを保持します。

streamdata2のコンテンツをcombinedstreamdataファイルに追加する方法を見てみましょう。

$ cat streamdata2 >> combinedstreamdata

Combinedstreamdata ファイルには、streamdata1ファイルとstreamdata2ファイルの両方のコンテンツが含まれるようになりました。

$ cat combinedstreamdata
tables
ladders
chairs
planes
trains
automobiles

7. 出力から入力への配管

Linuxコマンドを使用する場合、複数のタスクを連鎖させることが一般的なユースケースです。

| (パイプ)演算子。1つの出力を次のへの入力として渡すことにより、多くのコマンドを連鎖させることができます。

| 演算子を使用して、catコマンドからの出力をwcコマンドの入力ストリームにストリーミングしてみましょう。

$ cat streamdata2 | wc -l

8. リダイレクトエラー

ストリームリダイレクトの基本を理解したので、複数の出力ファイルを操作する方法を見てみましょう。

存在しないスクリプトを実行して、その架空の出力をログファイルにパイプしてみましょう。

$ exec doesnotexist.sh > out.log

次のエラーメッセージが表示されます。

exec: doesnotexist.sh: not found

コマンドがout.logに何を書き込んだかを見てみましょう。

$ cat out.log

うーん、ログファイルは空です。しかし、エラーメッセージが表示されました。これもログに記録する必要があります。

STDOUTとSTDERRをリダイレクトして、出力とエラー出力をキャプチャする方法を見てみましょう。

$ exec doesnotexist.sh >out.log 2>err.log

上記のステートメントでは、標準出力をout.log に送信し、標準エラーをerr.logに送信します。

具体的には、ファイルハンドル– 2>err.logを使用して標準エラーストリームを参照しました。 ファイルハンドルがデフォルトであるため、標準出力のファイルハンドルを指定する必要はありませんでした。

コマンドがerr.logに何を書き込んだかを確認してみましょう。

$ cat err.log
exec: doesnotexist.sh: not found

エラーメッセージは、エラーログファイルに正常にリダイレクトされました。

この例では、両方の出力ストリーム(STDOUT、STDERR)を処理し、それぞれを独自のログファイルに転送しました。

9. 出力とエラーのマージ

STDOUTとSTDERRをそれぞれのログファイルに転送することはできますが、単一のログファイルを処理するという単純さを好むことがよくあります。

The >& 演算子は、に使用される特別な演算子ですあるストリームから別のストリームに出力を送信します。 これを使用して、の出力をパイプすることができます STDERR STDOUT:

ファイルハンドルを活用する方法を見てみましょう >& STDOUTとSTDERRの出力を含む単一のログファイルを提供するには、次のようにします。

$ cat streamdata1 streamdata2 streamdata3 2>&1>out.log
$ cat out.log
tables
ladders
chairs
planes
trains
automobiles
cat: streamdata3: No such file or directory

予想どおり、streamdata1およびstreamdata2の内容は、 streamdata3 にあるため、予想されるエラーメッセージとともにout.logにあります。事実、存在しません。

10. 結論

このチュートリアルでは、Linuxストリームとは何か、およびそれらの使用方法を確認しました。

ストリームリダイレクトのさまざまな機能を示すいくつかのシナリオを実行しました。