LinuxI/Oリダイレクトの概要

提供:Dev Guides
移動先:案内検索

序章


Linuxに組み込まれているリダイレクト機能は、あらゆる種類のタスクを簡単に実行できるようにするために使用される強力なツールセットを提供します。 複雑なソフトウェアを作成している場合でも、コマンドラインからファイル管理を実行している場合でも、環境内のさまざまなI/Oストリームを操作する方法を知っていると生産性が大幅に向上します。

ストリーム


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

  • 標準入力stdin
  • 標準出力stdout
  • 標準エラーstderr

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

  • stdin0
  • stdout1
  • stderr2

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

標準入力


標準の入力ストリームは通常、ユーザーからプログラムにデータを伝送します。 標準入力を期待するプログラムは、通常、キーボードなどのデバイスから入力を受け取ります。 標準入力は、EOF(ファイルの終わり)に到達することによって終了します。 その名前で説明されているように、EOFは、読み取るデータがこれ以上ないことを示します。

標準入力の動作を確認するには、catプログラムを実行します。 Catは連結の略で、何かをリンクまたは結合することを意味します。 通常、2つのファイルの内容を組み合わせるために使用されます。 単独で実行すると、catはループプロンプトを開きます。

cat

猫を開いた後、実行中に一連の数字を入力します。

1
2
3
ctrl-d

数字を入力してEnterキーを押すと、実行中のcatプログラムに標準入力が送信され、その入力が期待されます。 次に、catプログラムは、入力を標準出力として端末ディスプレイに送り返します。

ユーザーはctrl-dを押してEOFを入力できます。 catプログラムがEOFを受信すると、停止します。

標準出力


標準出力は、プログラムによって生成されたデータを書き込みます。 標準出力ストリームがリダイレクトされていない場合、端末にテキストを出力します。 次の例を試してください。

echo Sent to the terminal through standard output

追加のオプションなしで使用すると、 echo コマンドは、コマンドラインで渡された引数を表示します。 引数は、プログラムによって受け取られるものです。

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

echo

引数がないため、空の行が返されます。

標準エラー


標準エラーは、実行のある時点で失敗したプログラムによって生成されたエラーを書き込みます。 標準出力と同様に、このストリームのデフォルトの宛先はターミナルディスプレイです。

プログラムの標準エラーストリームが2番目のプログラムにパイプされると、パイプされたデータ(プログラムエラーで構成される)も同時に端末に送信されます。

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

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

ls % 

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

ls: cannot access %: No such file or directory

ストリームリダイレクト


Linuxには、ストリームごとにリダイレクトコマンドが含まれています。 これらのコマンドは、標準出力をファイルに書き込みます。 存在しないファイルが(シングルブラケットまたはダブルブラケットコマンドのいずれかによって)ターゲットにされている場合、その名前の新しいファイルが書き込み前に作成されます。

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

上書きする

  • >-標準出力
  • < -標準入力
  • 2>-標準エラー

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

追加する

  • >>-標準出力
  • << -標準入力
  • 2>>-標準エラー

例を見てみましょう:

cat > write_to_me.txt
a
b
c
ctrl-d

ここでは、ループの結果として作成されたファイルへの書き込みにcatが使用されています。

catを使用してwrite_to_me.txtの内容を表示します。

cat write_to_me.txt

次の内容が含まれている必要があります。

a
b
c

catをもう一度write_to_me.txtにリダイレクトし、3つの数字を入力します。

cat > write_to_me.txt
1
2
3
ctrl-d

catを使用してwrite_to_me.txtを表示すると、次のように表示されます。

1
2
3

ファイルがシングルブラケットコマンドによって上書きされたため、以前の内容は存在しなくなりました。

今度は二重角かっこを使用して、猫のリダイレクトをもう1つ実行します。

cat >> write_to_me.txt
a
b
c
ctrl-d

write_to_me.txtをもう一度開くと、次のように表示されます。

1
2
3
a
b
c

2番目のファイルが最初の猫を上書きしなかったため、ファイルには猫の両方の使用からのテキストが含まれるようになりました。

パイプ


パイプは、あるプログラムから別のプログラムにストリームをリダイレクトするために使用されます。 プログラムの標準出力がパイプを介して別のプログラムに送信される場合、2番目のプログラムによって受信された最初のプログラムのデータは端末に表示されません。 2番目のプログラムによって返されたフィルタリングされたデータのみが表示されます。

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

*|*

パイプを使用したコマンドの例:

ls | less

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

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

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

フィルタ


Filters は、パイプされたリダイレクトと出力を変更するコマンドです。 フィルタコマンドは、パイプなしで使用できる標準のLinuxコマンドでもあることに注意してください。

  • find -Findは、findに渡された引数と一致するファイル名のファイルを返します。
  • grep -Grepは、grepに渡された文字列パターンに一致するテキストを返します。
  • tee -Teeは、標準入力を標準出力と1つ以上のファイルの両方にリダイレクトします。
  • tr --trは、ある文字列を検索して別の文字列に置き換えます。
  • wc -wcは文字、行、および単語をカウントします。


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

コマンド>ファイル

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

ls ~ > root_dir_contents.txt

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

コマンド>/dev / null

/ dev / nullは、リダイレクトされるデータをゴミ箱に移動するために使用される特別なファイルです。 これは、不要な標準出力を破棄するために使用されます。そうしないと、コマンドまたはスクリプトの機能に干渉する可能性があります。 / dev/nullに送信された出力はすべて破棄されます。 将来的には、シェルスクリプトを作成するときに、標準出力と標準エラーを/ dev/nullにリダイレクトする方法が見つかるかもしれません。

ls > /dev/null

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

コマンド2>ファイル

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

mkdir '' 2> mkdir_log.txt

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

コマンド>>ファイル

このパターンは、コマンドの標準出力をファイルにリダイレクトし、はファイルの既存の内容を上書きしません。

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

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

コマンド2>>ファイル

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

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

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

コマンド| 指図

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

find /var lib | grep deb

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

コマンド| ティーファイル

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

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

wc /etc/magic | tee magic_count.txt

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

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

コマンド| コマンド| コマンド>>ファイル

このパターンは、最初のコマンドの標準出力を事前に指示し、次の2つのコマンドでフィルタリングします。 次に、最終結果をファイルに追加します。

ls ~ | grep *tar | tr e E >> ls_log.txt

これは、ルートディレクトリ(〜)でlsを実行し、結果をgrepコマンドにパイプすることから始まります。 この場合、grepは、ファイル名または拡張子にtarを含むファイルのリストを返します。

次に、grepの結果がtrにパイプされます。これにより、文字eの出現箇所がEに置き換えられます。これは、eが最初の引数(検索する文字列)として渡されるためです。 Eは2番目の引数(最初の引数の一致を置き換える文字列)として渡されます。 この最終結果は、ファイルls_log.txtに追加されます。このファイルは、まだ存在しない場合に作成されます)。

結論


Linuxコマンドラインに組み込まれているリダイレクト機能の使用方法を学ぶのは少し難しいかもしれませんが、このチュートリアルを完了した後は、このスキルセットを習得する準備が整っています。 リダイレクトとパイプの動作の基本を理解したので、このガイドで強調表示されているプログラムとパターンを頻繁に使用するシェルスクリプトの世界への進出を開始できます。

このチュートリアルで紹介したコマンドをさらに深く掘り下げたい場合は、manコマンド|を使用して行うことができます。 less。 例えば:

man tee | less

これにより、teeプログラムで使用できるコマンドの完全なリストが表示されます。 このパターンを使用して、任意のLinuxコマンドまたはプログラムの情報と使用オプションを表示できます。

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

デビッド・コラゾ