序章

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

前提条件

このガイドに従うには、Linuxサーバーにアクセスできる必要があります。 サーバーへの初めての接続に関する情報が必要な場合は、SSHを使用したLinuxサーバーへの接続に関するガイドに従ってください。

ストリーム

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

  • 標準入力 stdin

  • 標準出力 stdout

  • 標準エラー stderr

ストリームにも番号が付けられます。

  • stdin 0

  • stdout 1

  • stderr 2

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

標準入力

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

標準出力

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

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

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

引数なしでechoを実行します。

  1. echo

空の行を返します。 一部のプログラムは、引数が提供されていないと何もしません。

標準エラー

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

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

引数なしで実行すると、lsは現在のディレクトリ内のコンテンツを一覧表示します。 lsを引数としてディレクトリを指定して実行すると、提供されたディレクトリの内容が一覧表示されます。

  1. ls %

% iは既存のディレクトリではないため、次のテキストが標準エラーに送信されます。

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

標準エラーを生成するためにプログラムがクラッシュしたり実行を終了したりする必要はありません。一部の出力が標準出力または標準エラーのどちらに送信されるかは、プログラムの動作に依存します。 これらは技術的にはまったく違いはありません。1つの出力ストリームがエラーメッセージ用に予約されているだけであり、一部のツールでは、標準エラーが空であるとプログラムが正常に実行されたと見なします。 一部のプログラムは、クラッシュしたり、意図した出力を生成できなかったりすることなく、マイナーエラーを標準エラーに出力します。 これは、意図した出力を意図しない出力から分離するための規則としてのみ使用されます。

ストリームリダイレクト

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

角かっこが1つ付いたコマンドoverwrite宛先の既存のコンテンツ。

上書きする

  • >-標準出力

  • < -標準入力

  • 2>-標準エラー

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

追加する

  • >>-標準出力

  • << -標準入力

  • 2>>-標準エラー

パイプ

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

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

パイプを使用したコマンドの例を次に示します。

  1. ls | less

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

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

パイプの機能は似ているように見えるかもしれませんが >>>、違いは、パイプがデータをあるコマンドから別のコマンドにリダイレクトするのに対し、>>>はファイルに排他的にリダイレクトするために使用されることです。

フィルタ

Filters は、別のプログラムからパイプされた出力で一般的に使用されるプログラムのクラスです。 それらの多くはそれ自体でも役立ちますが、配管の動作を特によく示しています。

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

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

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

  • tr-1つの文字列を検索して別の文字列に置き換えます。

  • wc -文字、行、および単語をカウントします。

リダイレクト、パイピング、および基本的なフィルターについて説明したので、次に、いくつかの一般的なリダイレクトパターンと例を見てみましょう。

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

  1. ls ~ > root_dir_contents.txt

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

The 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. エラーは引き続き端末に送信され、テキストとして表示されることに注意してください。

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

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

このコマンドのペアは、最初に、ユーザーが入力したテキストをエコーを介して新しいファイルにリダイレクトします。 次に、2番目のechoコマンドで受信したテキストを、その内容を上書きせずに既存のファイルに追加します。

The command 2>> file 上記のパターンは、コマンドの標準エラーストリームを、ファイルの既存の内容を上書きせずにファイルにリダイレクトします。 このパターンは、プログラムまたはサービスのエラーログを作成する場合に役立ちます。これは、ファイルが書き込まれるたびにログファイルの以前のコンテンツが消去されないためです。

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

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

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

  1. find /var lib | grep deb

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

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

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

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

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

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

結論

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

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