GNU/Linux >> Linux の 問題 >  >> Linux

説明:Linuxでの入力、出力、およびエラーのリダイレクト

基本的なLinuxコマンドに精通している場合は、入出力リダイレクトの概念も学ぶ必要があります。

Linuxコマンドがどのように機能するかはすでにご存知でしょう。入力を受け取り、出力を提供します。ここのシーンには数人のプレイヤーがいます。それらについてお話ししましょう。

Stdin、stdout、およびstderr

Linuxコマンドを実行すると、そのコマンドに関与する3つのデータストリームがあります。

  • 標準入力(stdin)は、入力データのソースです。デフォルトでは、stdinはキーボードから入力されたテキストです。ストリームIDは0です。
  • 標準出力(stdout)は、コマンドの結果です。デフォルトでは、画面に表示されます。ストリームIDは1です。
  • 標準エラー(stderr)は、コマンドによって生成されるエラーメッセージ(存在する場合)です。デフォルトでは、stderrも画面に表示されます。ストリームIDは2です。

これらのストリームには、バッファメモリと呼ばれるプレーンテキストのデータが含まれています。

それを水の流れと考えてください。水源、たとえば蛇口が必要です。パイプを接続すると、バケツに保管するか(ファイル)、植物に水をやる(印刷する)ことができます。必要に応じて、別のタップに接続することもできます。基本的に、あなたは水を向け直しています。

Linuxにもこのリダイレクトの概念があり、stdin、stdout、およびstderrを通常の宛先から別のファイルまたはコマンド(またはプリンターなどの周辺機器)にリダイレクトできます。

リダイレクトがどのように機能し、どのように使用できるかを示しましょう。

出力リダイレクト

リダイレクションの最初の最も単純な形式は、stdoutリダイレクションとも呼ばれる出力リダイレクションです。

デフォルトでは、コマンドの出力が画面に表示されることはすでにご存知でしょう。たとえば、lsコマンドを使用してすべてのファイルを一覧表示すると、次の出力が得られます。

[email protected]:~$ ls
appstxt  new.txt  static-ip.txt

出力リダイレクトを使用すると、出力をファイルにリダイレクトできます。この出力ファイルが存在しない場合は、シェルが作成します。

command > file

たとえば、lsコマンドの出力をoutput.txtという名前のファイルに保存します。

[email protected]:~$ ls > output.txt
出力ファイルは事前に作成されています

この出力ファイルの内容はどうあるべきだと思いますか? catコマンドを使用してサプライズを表示させてください:

[email protected]:~$ cat output.txt 
appstxt
new.txt
output.txt
static-ip.txt

そこにoutput.txtが含まれていることに気づきましたか ?これを示すために、意図的にこの例を選択しました。

stdoutがリダイレクトされる出力ファイルは、目的のコマンドが実行される前に作成されます。なんで?出力の送信先となる出力先を用意する必要があるためです。

クローバーの代わりに追加

しばしば無視される問題の1つは、既存のファイルにリダイレクトすると、シェルが最初にファイルを消去(クローバー)することです。これは、出力ファイルの既存のコンテンツが削除され、コマンドの出力に置き換えられることを意味します。

>>リダイレクト構文を使用して、上書きする代わりに追加できます。

command >> file

ヒント :set -C

を使用して、現在のシェルセッションでのクローバリングを禁止できます。

なぜstdoutをリダイレクトするのですか?後で参照できるように出力を保存して、後で分析することができます。コマンド出力が大きすぎて画面全体を占める場合に特に役立ちます。ログを収集するようなものです。

パイプのリダイレクト

stdinリダイレクトを確認する前に、パイプリダイレクトについて学習する必要があります。これはより一般的であり、おそらく頻繁に使用するでしょう。

パイプリダイレクトを使用すると、コマンドの標準出力を別のコマンドの標準入力に送信します。

command 1 | command 2

実例をお見せしましょう。たとえば、現在のディレクトリに表示されているファイルの数を数えたいとします。 ls -1を使用できます (文字Lではなく数字の1)現在のディレクトリ内のファイルを表示するには:

[email protected]:~$ ls -1
appstxt
new.txt
output.txt
static-ip.txt

ファイルの行数を数えるためにwcコマンドが使用されていることはすでにご存知でしょう。これらのコマンドの両方をパイプと組み合わせると、次のようになります。

[email protected]:~$ ls -1 | wc -l
4

パイプを使用すると、両方のコマンドが同じメモリバッファを共有します。最初のコマンドの出力はバッファに保存され、同じバッファが次のコマンドの入力として使用されます。

パイプラインの最後のコマンドの結果が表示されます。以前のコマンドの標準出力は、画面に移動するのではなく、次のコマンドに送られるため、これは明らかです。

パイプの方向転換または配管は、2つのコマンドを接続するだけに限定されません。 1つのコマンドの出力を次のコマンドの入力として使用できる限り、さらに多くのコマンドを接続できます。

command_1 | command_2 | command_3 | command_4

stdout / stdinはデータのチャンクであり、ファイル名ではないことを忘れないでください

一部の新しいLinuxユーザーは、リダイレクトの使用中に混乱します。コマンドが一連のファイル名を出力として返す場合、それらのファイル名を引数として使用することはできません。

たとえば、findコマンドを使用して.txtで終わるすべてのファイルを検索する場合、次のように直接ではなく、パイプを介して検索したファイルを新しいディレクトリに移動することはできません。

find . -type f -name "*.txt" | mv destination_directory

これが、execまたはxargsコマンドと組み合わせて使用​​されるfindコマンドをよく目にする理由です。これらの特別なコマンドは、「ファイル名の束を含むテキストを、引数として渡すことができるファイル名に変換」します。

find . -type f -name "*.txt" | xargs -t -I{} mv {} ../new_dir
入力リダイレクト

stdinリダイレクトを使用して、テキストファイルのコンテンツを次のようなコマンドに渡すことができます。

command < file

stdinがあまり使用されていないことはわかりません。これは、ほとんどのLinuxコマンドが引数としてファイル名を受け入れるため、stdinリダイレクトが必要ない場合が多いためです。

これを例に取ってください:

head < filename.txt

上記のコマンドは、 head filename.txtである可能性があります。 (<なし)

stdinリダイレクトが完全に役に立たないというわけではありません。一部のコマンドはそれに依存しています。たとえば、trコマンドを取り上げます。このコマンドは多くのことを実行できますが、以下の例では、入力テキストを小文字から大文字に変換します。

tr a-z A-Z < filename.txt

実際、catコマンドの不必要な使用を避けるために、特にパイプを介してstdinを使用することをお勧めします。

たとえば、多くの人は上記の例をcatで使用し、次にtrを使用します。率直に言って、ここで猫を使う必要はありません。

cat filename.txt | tr a-z A-Z
リダイレクトを組み合わせる

必要に応じて、stdin、stdout、およびパイプリダイレクトを組み合わせることができます。

たとえば、次のコマンドは、現在のディレクトリ内のすべての.txtファイルを一覧表示し、それらの.txtファイルをカウントして、出力を新しいファイルに保存します。

ls *.txt | wc -l > count.txt
エラーリダイレクト

コマンドやスクリプトを実行すると、画面にエラーメッセージが表示されることがあります。

[email protected]:~$ ls -l ffffff > output.txt
ls: cannot access 'ffffff': No such file or directory

この記事の冒頭で、3つのデータストリームがあり、stderrはデフォルトで画面に表示される出力データストリームの1つであると述べました。

stderrをリダイレクトすることもできます。これは出力データストリームであるため、stdoutリダイレクトに使用したものと同じ>または>>リダイレクトシンボルを使用できます。

しかし、両方が出力データストリームである場合、stdoutとstderrをどのように区別しますか?ストリームID(ファイル記述子とも呼ばれます)による。

データストリーム ストリームID
stdin 0
stdout 1
stderr 2
-t、 –リスト
-u、 –更新
-x、 –extract、–get
-j、 –bzip2
-z、 –gzip、–gunzip、–ungzip

デフォルトでは、出力リダイレクト記号>を使用すると、実際には1>を意味します。つまり、ID1のデータストリームがここに出力されているということです。

stderrをリダイレクトする必要がある場合は、2>または2>>のようなIDを使用します。これは、出力リダイレクトがデータストリームstderr(ID 2)用であることを意味します。

Stderrリダイレクトの例

いくつか例を挙げてお見せしましょう。エラーを保存したいだけの場合は、次のように使用できます。

[email protected]:~$ ls fffff 2> error.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'fffff': No such file or directory

それは簡単でした。もう少し複雑に(そして便利に)しましょう:

[email protected]:~$ ls -l new.txt ffff > output.txt 2> error.txt 
[email protected]:~$ cat output.txt 
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'ffff': No such file or directory

上記の例では、lsコマンドは2つのファイルを表示しようとします。一方のファイルでは成功し、もう一方のファイルではエラーになります。したがって、ここで行ったことは、stdoutをouput.txt(>付き)にリダイレクトし、stderrをerror.txt(2>付き)にリダイレクトすることです。

stdoutとstderrの両方を同じファイルにリダイレクトすることもできます。それを行う方法はいくつかあります。

以下の例では、最初にstderr(2>>を含む)をappendモードでcombined.txtファイルに送信します。次に、stdout(>>付き)が追加モードで同じファイルに送信されます。

[email protected]:~$ ls -l new.txt fff 2>> combined.txt >> combined.txt 
[email protected]:~$ cat combined.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

別の方法で、これが推奨される方法は、2>&1のようなものを使用することです。これは、大まかに「stderrをstdoutと同じアドレスにリダイレクトする」と解釈できます。

前の例を見てみましょう。今回は2>&1を使用して、stdoutとstderrの両方を同じファイルにリダイレクトします。

[email protected]:~$ ls -l new.txt fff > output.txt 2>&1
[email protected]:~$ cat output.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

追加モードで使用することを考えて2>>&1を使用することはできないことに注意してください。 2>&1はすでに追加モードになっています。

また、最初に2>を使用し、次に1>&2を使用して、stdoutをstderrと同じファイルにリダイレクトすることもできます。基本的に、あるデータストリームを別のデータストリームにリダイレクトするのは「>&」です。

概要
  • 3つのデータストリームがあります。 1つの入力、stdin(0)および2つの出力データストリームstdout(1)およびstderr(2)。
  • キーボードはデフォルトの標準デバイスであり、画面はデフォルトの出力デバイスです。
  • 出力リダイレクトは>または>>(追加モードの場合)で使用されます。
  • 入力リダイレクトは<。
  • で使用されます
  • stderrは2>または2>>を使用してリダイレクトできます。
  • stderrとstdoutは、2>&1を使用して組み合わせることができます。

リダイレクトについて学習しているので、teeコマンドについても知っておく必要があります。このコマンドを使用すると、標準出力に表示すると同時にファイルに保存することができます。

Linuxでのリダイレクトに関するこの詳細なガイドを気に入っていただけたでしょうか。それでも疑問がある場合、またはこの記事を改善するための提案がある場合は、コメントセクションでお知らせください。


Linux
  1. Linuxでの入出力とエラーリダイレクトの操作

  2. Linuxコマンド:jobs、bg、およびfg

  3. Linux/Unixでの入力/出力リダイレクト

  1. Linuxの履歴コマンドを詳細に説明

  2. $ _対!$。前のコマンドと出力リダイレクトの最後の引数?

  3. Linuxでのlsコマンド:17の便利な例の説明

  1. Linuxtarコマンドの説明

  2. Linux のパイプとリダイレクト - 解説!

  3. Linux で入出力エラーを解釈して修正する方法は?