BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Linux / Bashでstdin、stdout、stderrを例とともにリダイレクトします

Linux / Bashシェルには、コマンドを実行するときに利用できる3つのデータストリームがあります– stdin stdout、 およびstderr 。使用方法は次のとおりです。

stdin stdout stderr コンソールにテキストを表示できるようにし、各ストリームに出力されるデータを他のプログラムに送信できます。

これらは、標準ストリームと呼ばれます。 。

stdinとは (標準入力)?

テキスト入力ストリーム。

アプリケーションは、 stdinを介してテキストを受け入れることができます 入力として。

stdoutとは (標準出力)?

プログラムのテキスト出力ストリーム。

アプリケーションは、 stdout を介して他のプログラム(または表示用のコンソール)にデータを送信します 。

stderr(標準エラー)とは何ですか?

プログラムのテキストエラー出力ストリーム。

プログラムでエラーが発生した場合は、エラーに関するデータを stdout経由で送信する必要があります。 ストリーム。

…ええ、でもそれは実際にはどういう意味ですか?

コンピュータプログラムは、入力データと出力データを処理します。たとえば、プログラムは数学の方程式を受け入れ、その解を提供する場合があります。

プログラムに方程式INを取得する方法と、プログラムから回答OUTを取得する方法が必要です。また、方程式が解けなかったかどうかを知りたいので、他の出力とは別に、生成されたエラーを確認したいと思います。

それがstdin stdout 、および stderr

すべてが同じように機能することで作業が楽になるため、これらの入力、出力、およびエラーストリームが標準化され、コマンドライン用に構築されたアプリケーションがすべて同じように動作するようになりました。

したがって、標準ストリーム 。各ストリームには、0〜3の数値識別子があります:

0 stdin
1 stdout
2 stderr

stdinからのリダイレクト/パイプ 、 stdout Bash/Shellのstderr

Linuxシェルに入力するのはテキストのストリームです。入力すると、テキストストリームがコンソール入力に送られます。

アプリケーションが実行され、アプリケーションから出力されたテキストデータがコンソールに送られ、表示できるようになります。

これは、コンソールで作業するときのすべてのデフォルトの動作ですが、変更することができます。ストリームはリダイレクトできます。たとえば、プログラムの出力は、表示用のコンソールではなく、ファイルに直接ストリーミングできます。

あるプログラムからの出力を別のプログラムの入力に直接リダイレクトできます。

リダイレクトと配管を使用した基本的な例をいくつか示します。

リダイレクト

通常、エコー コマンドはコンソールにテキストを出力します:

echo "hello there!"

stdout エコープログラムのは、画面に表示されるデフォルトのパスを使用しています。

リダイレクト 別の場所に送信できます。ここでは、ファイルに送信されます:

echo "hello there!" > test.txt

text.txtというファイル 「こんにちは!」というテキストを含むように作成されます (注意してください。ファイルがすでに存在する場合は、上書きされます

>>を使用してファイルを追加できます >の代わりに

次に、 stdinをリダイレクトしましょう <を使用する

cat < test.txt

コマンドはtext.txtの内容を読み取ります そのstdinに ストリーミングしてから、 cat コマンドは次のように設計されています–提供されたデータを stdoutに出力します 、デフォルトでは表示用のコンソールです。したがって、これは単にこんにちは!を出力します。 コンソールに。

ファイル内のデータはstdinに送信されました catコマンドの場合–リダイレクトされました。

これは一種の浮気です、 コマンドは、パイプを使用せずにパラメータとして渡されたファイル名から読み取ろうとしますが、この例では最も単純なコマンドです。

stdinをリダイレクトできます およびstdout 同じコマンドで:

cat < test.txt > output.txt

stdin test.txt を読んで、リダイレクトされています に プログラム、および stdout から プログラムは、 output.txtというファイルに転送されます。 。

繰り返しになりますが、これは実際には cat を使用しているだけなので、不正行為です。 ファイルをコピーするコマンドですが、他のコマンドの説明に依存しない簡単な例です。

最後に、 stderrをリダイレクトできます 読み取りたい一意のストリーム番号を指定してストリームします( stdout として) はデフォルトです。指定する必要はありません):

cat nofile.txt 2> error.txt

stdout 番号2で識別されます – catがエラーを生成した場合、このストリームを介してファイル error.txtに送信されます。 。

上記の例では、 error.txtというファイルが作成されます。 テキストを含む:

cat: nofile.txt: No such file or directory

として コマンドでファイルが見つかりませんでしたnofile.txt

同時リダイレクト

上記の例では、 stderr ストリームは数値識別子で識別されました。これは、 stdoutをリダイレクトできることを意味します およびstderr 同じコマンドで、リダイレクトするものを指定します:

echo "hello there! 1>test.txt 2>error.txt

上記、 stdout test.txtに送信されます およびstderr error.txtに送信されます 。

配管

配管はリダイレクトと同じですが、 stdinのみを扱います 、および stdout エラーは無視されます。

echo "hello there!" | cat

ここでは、パイプ( | )パイプ(リダイレクト) stdout エコー stdinへのコマンド の コマンド。

結論

コマンドラインアプリケーションの操作は、最初は直感的ではないように思われるかもしれませんが、タスクを自動化する際の強力なツールです。 stdin stdout、 およびstderr標準ストリーム この柔軟性の基礎です。コマンドをチェーン化して、ほぼすべてのタスクを処理できる複雑なワークフローを作成できます。


  1. このパズルの本でBashを学ぶ

    コンピューターは私の趣味であり、職業でもあります。私のアパートには約10個が散らばっていて、すべてLinux(Macを含む)を実行しています。コンピューターとコンピュータースキルのアップグレードを楽しんでいるので、バッシュアウトに出くわしたとき Sylvain Lerouxによって、私はそれを買うチャンスに飛びつきました。私はDebianLinuxでコマンドラインをよく使用しますが、Bashの知識を広げる絶好の機会のように思えました。著者が序文で私のお気に入りの2つのディストリビューションの1つであるDebianLinuxを使用していると説明したとき、私は微笑んだ。 Bashを使用するとタス

  2. 6 つの実用的な例を含む Bash シェル関数のチュートリアル

    Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この