データストリーム

バッシュ この記事では、 bashでのデータストリームの操作について説明します。 Linuxの初心者でも理解できるように、最もアクセスしやすいシンプルな言語で記述しようとしました。





私の記事の1つで 、次のコマンドを使用してファイルにサウンドを録音する方法を説明しました。



猫/ 開発 /オーディオ> /tmp/my.sound


このコマンドは、catコマンドを使用してファイル(デバイス)/ dev / audioを読み取り、その情報を/tmp/my.soundファイルにリダイレクトします(>演算子を使用)。



各プログラムには、 stdoutstderrstdinの 3つのシステムスレッドがあります。



標準



プログラムの標準データ出力ストリーム。 たとえば、lsコマンドを記述すると、コンソールに表示されるこのストリーム内のフォルダーとファイルのリストが表示されます。



$ ls

bin incoming pub usr


stderr



エラー出力ストリーム。 プログラムが必要なすべてを実行できなかった場合-このストリームに書き込みます。 たとえば、rmが存在しないファイルを削除しようとした場合:



$ rm example.txt

rm:example.txt:そのようなファイルまたはディレクトリはありません


標準



データ入力ストリーム。 しかし、これはかなり興味深い便利なストリームです。 たとえば、Webサーバーは、インタープリターにCGIを介してスクリプトを実行するように要求するときに、これを使用します。 また試すことができます:



$ echo '<?php echo "Hello world"; ?> '| php

ハローワールド


この例では、出力リダイレクト演算子に遭遇しました。 後で説明します。



詳細:

http://ru.wikipedia.org/wiki/Standard_Streams





スレッドのリダイレクト



最初に、ストリームをファイル、デバイス、その他のストリームにリダイレクトすることを検討します。



$ ls > 1.txt


この例では、lsコマンドの標準出力を1.txtファイルに送信しました。 私たちはそれを読みます:



$ cat 1.txt

bin incoming pub usr


はい、すべてが正常に記録されました。



ここで、rmコマンドの標準エラーを指示してみてください。



$ rm example.txt 2> 1.txt


ここでは、stderrストリーム番号(2)を使用しました。 デフォルトでは、>演算子はstdoutストリーム(番号1)をリダイレクトします。別のストリームを送信するには、その番号を>演算子の前に置く必要があります。



一部のフローを他のフローに向けることができます。



$ rm exmple.txt > 1.txt 2>&1


この例では、stdoutストリームを1.txtファイルに転送し、ストリーム番号の前に&演算子を使用してstdoutが転送された場所にstderrを転送しました。



それでは、stdinストリームを試してみましょう。 たとえば、あるプロジェクトですべての「.svn」フォルダーを見つけて削除したい:



cd myproject

見つける。


パラメータ付きのfindコマンド。 このフォルダーとすべてのサブフォルダーで見つかったすべてのサブフォルダーとファイルを標準出力に表示します。



ここで、「。svn」という名前のフォルダーのみを選択する必要があります。



見つける。 | grep -e '/.svn$'


オペレーター| あるアプリケーションの標準出力を次のアプリケーションの標準入力にリダイレクトします。 つまり、findで見つかったすべての行がgrepコマンドに送られ、特定の条件に従って行が選択されて表示されます。 ここで、条件は、行が「/.svn」で終了することを示す正規表現です。



必要なフォルダーを選択しましたが、削除する必要があります。



rm -Rf `検索。 | grep -e '/.svn$' '


そして再び新しい演算子: ` 。 囲むコマンドからstdoutを取得し、指定された場所に文字列として挿入します。



すべてのファイルを要求し、「。svn」という名前のフォルダーを選択し、その結果を引数としてrmコマンドに渡したことがわかりました。 この場合、ファイル名とフォルダー名にスペースが含まれていると問題が発生します。 状況を修正します。



見つける。 | grep -e '/.svn$' | xargs rm -Rf


ここで、必要なファイルをxargsコマンドに渡します。このコマンドは、rm -Rfを呼び出し、パラメーターとして1行ずつstdinを使用します。 問題は解決しました。



誰もがこの一連の記事の作成を支援し、経験を共有できます。 ようこそ: http : //www.linuxman.ru やがて、Wikiへのすべての変更をHabrに転送します。



All Articles