Linux I/Oリダイレクションへの導入

紹介

Linuxに組み込まれているリダイレクト機能は、多くのワークフローを最適化するための堅牢なツールセットを提供します。ソフトウェア開発の「Unix哲学」は、それぞれが1つのことをうまく行うツールを作ることでした。この哲学は、現代のコマンドラインツールに引き継がれており、個々に強力であり、組み合わせることで指数関数的に強力になります。複雑なソフトウェアを書いている場合でも、コマンドラインで作業している場合でも、環境内の異なる入出力ストリームを操作する方法を知っていると、生産性が大幅に向上します。

前提条件

このガイドに従うには、Linuxサーバーにアクセスできる必要があります。サーバーに初めて接続する方法に関する情報が必要な場合は、SSHを使用してLinuxサーバーに接続する方法に関する当社のガイドに従うことができます。

ストリーム

Linux環境での入出力は、3つのストリームに分散されています。これらのストリームは次のとおりです。

  • 標準入力stdin

  • 標準出力stdout

  • 標準エラーstderr

これらのストリームには番号が付けられています:

  • stdin0

  • stdout1

  • stderr2

ユーザーと端末の間の標準的な対話中、標準入力はユーザーのキーボードから来ます。標準出力と標準エラーは、ユーザーの端末にテキストとして表示されます。これらの3つのストリームを総称して、標準ストリームと呼びます。

標準入力

標準入力ストリームは通常、ユーザーからプログラムにデータを渡します。標準入力を予期するプログラムは通常、キーボードなどのデバイスから入力を受け取ります。このチュートリアルの後半では、1つのプログラムの出力を別のプログラムの標準入力として使用する例を見ることができます。

標準出力

標準出力はプログラムによって生成される出力です。標準出力ストリームがリダイレクトされていない場合、テキストは直接端末に出力されます。いくつかの任意のテキストを出力してみてください、echoを使用して:

  1. echo Sent to the terminal
Output
Sent to the terminal

追加のオプションなしで使用すると、echoコマンドはコマンドラインで渡された引数を出力します。

引数なしでechoを実行してください:

  1. echo

空行が返されます。提供された引数なしで何も行わないプログラムもあります。

標準エラー

標準エラーには、何らかの方法で失敗したプログラムによって生成されたエラーが含まれます。標準出力と同様に、このストリームのデフォルトの宛先は端末ディスプレイです。

lsコマンドを使用した標準エラーの基本的な例を見てみましょう。lsはディレクトリの内容をリストします。

引数なしで実行すると、lsは現在のディレクトリ内の内容をリストします。 lsがディレクトリを引数として実行されると、指定したディレクトリの内容がリストされます。

  1. ls %

存在しないディレクトリであるため、これにより次のテキストが標準エラーに送信されます:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

ストリームリダイレクション

Linuxには、各ストリームのリダイレクションコマンドが含まれています。これらは、標準出力または標準エラーをファイルに書き込むために使用できます。存在しないファイルに書き込む場合、その名前の新しいファイルが書き込みの前に作成されます。

単一の角かっこを持つコマンドは、宛先の既存の内容を上書きします。

上書き

  • > – 標準出力

  • < – 標準入力

  • 2> – 標準エラー

二重の角かっこを持つコマンドは、宛先の既存の内容を上書きしません

追記

  • >> – 標準出力

  • << – 標準入力

  • 2>> – 標準エラー

パイプ

パイプは、ストリームを1つのプログラムから別のプログラムにリダイレクトするために使用されます。プログラムの標準出力がパイプを介して別のプログラムに送信されると、最初のプログラムの出力は端末に表示されるのではなく、2番目のプログラムの入力として使用されます。2番目のプログラムが返したデータのみが表示されます。

Linuxのパイプは、縦棒で表されます:|

以下は、パイプを使用したコマンドの例です:

  1. ls | less

これは、現在のディレクトリの内容を表示するlsの出力を取り、それをlessプログラムにパイプします。lessは、送信されたデータを1行ずつ表示します。

lsは通常、複数の行にわたってディレクトリの内容を表示します。それをlessで実行すると、各エントリが新しい行に配置されます。

パイプの機能は>>>の機能と似ているように見えますが、パイプはデータを1つのコマンドから別のコマンドにリダイレクトしますが、>>>は、専らファイルにリダイレクトするために使用されます。

フィルター

フィルターは、他のプログラムからの出力をパイプに送られることが一般的に使用されるプログラムのクラスです。それらの多くは単独でも便利ですが、特にパイプの挙動をよく示しています。

  • find – find に渡された引数と一致するファイル名を返します。

  • grep – grep に渡された文字列パターンと一致するテキストを返します。

  • tee – 標準入力を標準出力と1つ以上のファイルにリダイレクトします。

  • tr – 1つの文字列を別の文字列に置換します。

  • wc – 文字、行、および単語を数えます。

今、リダイレクト、パイプ、および基本的なフィルターについて紹介しましたので、一般的なリダイレクトのパターンと例を見てみましょう。

command > file パターンは、コマンドの標準出力をファイルにリダイレクトします。

  1. ls ~ > root_dir_contents.txt

上記のコマンドは、ホームディレクトリ(~)の内容を標準出力として渡し、出力をroot_dir_contents.txtという名前のファイルに書き込みます。これは単一の角カッコのコマンドであるため、以前の内容が削除されます。

command > /dev/null パターンは、標準出力をどこにもリダイレクトします。/dev/null は、リダイレクトされたデータを破棄するために使用される特別なファイルです。必要のない標準出力を破棄し、コマンドやスクリプトの機能に干渉する可能性のある標準出力を破棄するために使用されます。/dev/null に送信される出力はすべて破棄されます。

  1. ls > /dev/null

このコマンドは、ls コマンドから返された標準出力ストリームを /dev/null に渡して破棄します。

command 2> file パターンは、コマンドの標準エラーストリームをファイルにリダイレクトし、既存の内容を上書きします。

  1. mkdir '' 2> mkdir_log.txt

これは、無効なディレクトリ名 '' によって発生したエラーをリダイレクトし、log.txt に書き込みます。エラーは依然として端末に送信され、テキストとして表示されることに注意してください。

command >> file パターンは、ファイルの既存の内容を上書きすることなく、コマンドの標準出力をファイルにリダイレクトします。

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

この一連のコマンドは、最初にユーザーによって入力されたテキストを echo を介して新しいファイルにリダイレクトします。次に、2番目の echo コマンドによって受け取られたテキストを既存のファイルに追加しますが、その内容を上書きしません。

上記のcommand 2>> file パターンは、コマンドの標準エラー出力をファイルにリダイレクトし、ファイルの既存の内容を上書きせずに追記します。このパターンは、プログラムやサービスのエラーログを作成する際に便利であり、ログファイルは書き込まれるたびに以前の内容が消去されません。

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

上記のコマンドは、無効なfind引数によって発生したエラーメッセージをstderr_log.txtという名前のファイルにリダイレクトします。次に、無効なwc引数によって発生したエラーメッセージも同じファイルに追記されます。

command | command パターンは、最初のコマンドの標準出力を2番目のコマンドの標準入力にリダイレクトします。

  1. find /var lib | grep deb

このコマンドは、/varとそのサブフォルダーを検索し、文字列debに一致するファイル名と拡張子を探し、各パスの一致部分を赤で強調表示してファイルパスを返します。

command | tee file パターン(teeコマンドを含む)は、コマンドの標準出力をファイルにリダイレクトしてその内容を上書きします。その後、リダイレクトされた出力をターミナルに表示します。ファイルが存在しない場合は新しいファイルが作成されます。

このパターンのコンテキストでは、teeは通常、プログラムの出力を表示しながら同時にファイルに保存するために使用されます。

  1. wc /etc/magic | tee magic_count.txt

これは、文字、行、および単語の数を/etc/magicファイル(Linuxシェルがファイルの種類を決定するために使用する)でカウントし、それをteeコマンドにパイプ処理し、その後、wcの出力を2つの方向に分割し、ターミナルディスプレイとmagic_count.txtファイルに送信します。teeコマンドでは、文字Tを想像してください。文字の下部は初期データであり、上部はデータが2つの異なる方向(標準出力とターミナル)に分割されています。

複数のパイプを使用して、出力を複数のコマンドや/またはフィルタにリダイレクトできます。

結論

Linuxコマンドラインに組み込まれたリダイレクト機能の使用方法を学ぶことは重要なスキルです。リダイレクションとパイプの基本的な動作を見てきたので、このガイドで強調されているプログラムとパターンを頻繁に使用するシェルスクリプトの世界への旅を始めることができるでしょう。

特定のコマンドを検索したり、コマンドラインで行いたい操作を検索すること(例:「大文字で始まるすべてのファイルをディレクトリから削除する」など)も、特定のタスクをコマンドラインを使用して達成する必要がある場合に役立ちます。

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection