リダイレクトとパイピングは、システム管理者と開発者が頻繁に使用するbashスクリプトの2つの便利な機能です。このガイドでは、Bashリダイレクトとは何かについて説明します。 例のコマンドを使用してBashでリダイレクトを操作する方法。
リダイレクションがどのように機能するかを理解する前に、ファイル記述子が何であるかを学ぶことが重要です。
ファイル記述子とは何ですか?
Linuxでファイルを開くと、各ファイルに整数が割り当てられ、この情報がカーネルに保存されます。このようにして、カーネルはどのファイルが開かれ、どのプロセスがファイルを開いたかを認識します。割り当てられた整数は、ファイル記述子(略してFD)と呼ばれるものです。
デフォルトでは、すべてのプログラムは3つのファイル記述子で開始されます。
- FD 0->標準入力(stdin)->キーボード
- FD 1->標準出力(Stdout)->ディスプレイ(ターミナル)
- FD 2->標準エラー(Stderr)->表示(ターミナル)
/ dev
でファイル記述子を確認できます ディレクトリ:
$ ls -l / dev / std * lrwxrwxrwx1ルートルート158月27日21:32/dev / stderr-> / proc / self / fd /2lrwxrwxrwx1ルートルート158月27日21:32/dev / stdin-> / proc / self / fd /0lrwxrwxrwx1ルートルート15 Aug 27 21:32 / dev / stdout-> / proc / self / fd / 1
Stdin(FD0)は、キーボードから入力を取得します。 stdout(FD1)とstderr(FD2)が端末に送信されます。パイプとリダイレクトを使用する場合、入力の受け渡し方法と出力およびエラーの送信方法を変更できます。
出力をファイルにリダイレクトする
前述のように、プログラムの出力(stdout)とエラー(stderr)は端末に送信されます。 リダイレクト演算子">”を使用できます stdoutとstderrをファイルに書き込みます。
以下の例を見てください。 uname -mrs
を実行しています コマンドを実行し、出力を uname.log
という名前のファイルにリダイレクトします 。
$ uname -mrs> uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
ヘッズアップ: ">"
を使用する場合 演算子、ファイルが利用できない場合は、作成されます。また、ファイルがすでに存在する場合は、新しいコンテンツで上書きされます。
stdout(1)のファイル記述子番号を使用することもできます 出力をファイルにリダイレクトするリダイレクト演算子の前。
$ uname -mrs 1> uname.log
すでに述べたように、単一のリダイレクト演算子(>
)ファイルがすでに存在する場合にのみ、ファイルの内容を上書きします。ただし、同じファイルに上書きするのではなくコンテンツを追加する場合は、二重リダイレクト演算子を使用します(つまり、 >>
)。ここでもstdoutファイル記述子(1)を使用できます。
$ whoami>> uname.log
$ echo $ SHELL 1>> uname.log
$ cat uname.log Linux 5.10.0-8-amd64 x86_64ostechnix / bin / bash
Stderrの扱い方
すべてのプログラムは出力とエラーの両方を生成し、両方が端末に送信されます。多くの場合、エラーを無視するか、エラーを切り分けて、トラブルシューティングのために別のファイルにリダイレクトすることをお勧めします。
ls
を実行する簡単な例を見てみましょう これがどのように機能するかを確認するコマンド。 1つだけが存在する2つのファイルをリストしようとしています。すでに述べたように、ターミナルでエラーと出力の両方が発生します。
$ ls -l uname.log u1.log ls:「u1.log」にアクセスできません:そのようなファイルまたはディレクトリはありません-rw-r--r-- 1 ostechnix ostechnix 48 Aug 27 07:37 uname.log
同じls
を実行しています もう一度コマンドを実行しますが、今回は出力をファイルにリダイレクトします。出力からわかるように>
オペレーターはstdout(1)をファイルにリダイレクトしますが、stderr(2)は端末に送信されます。
$ ls -l uname.log u1.log> ls.op ls:「u1.log」にアクセスできません:そのようなファイルまたはディレクトリはありません
stderrをファイルにリダイレクトするには、 "2>"
を使用します オペレーター。エラーのみをファイルに送信するリダイレクト演算子の前に、stderr(2)のファイル記述子を使用する必要があります。
$ ls -l uname.log u1.log> ls.op 2> ls.err
$ cat ls.err ls:「u1.log」にアクセスできません:そのようなファイルまたはディレクトリはありません
現在、stdoutとstderrは別々のファイルに書き込まれています。 stdoutとstderrを1つのファイルに送信することもできます。
$ ls -l uname.log u1.log 1> ls.op 2> ls.op
bash 4.4から 、 &>
も使用できます stdoutとstderrの両方をファイルにリダイレクトするための署名。
$ ls -l uname.log u1.log&> ls.op
/ dev / nullとは何ですか?
Nullは、入力を受け入れて入力を破棄し、出力を生成しない文字特殊ファイルです。簡単に言うと、nullはリダイレクトしたものをすべて破棄します。
$ ls -l / dev / null crw-rw-rw- 1ルートルート1、3 Aug 27 06:01 / dev / null
リダイレクトでヌルが重要なのはなぜですか?不思議に思うかもしれません。場合によっては、stdoutまたはstderrを印刷または保存したくない場合があります。その場合、stdoutまたはstderrのいずれかを/ dev / nullにリダイレクトして、入力のストリームを破棄できます。
$ date> / dev / null $ date 1> / dev / null#Stdout to Null $ dateee 2> / dev / null#間違ったコマンド、Stderr to Null $ date&> / dev / null#Stdout / Stderr to Null
Bashでの入力リダイレクト
出力とエラーをファイルにリダイレクトする方法と同様に、入力リダイレクト演算子( <
)を使用してコマンドに入力を渡すこともできます。 。
簡単な単語カウントプログラムから始めましょう。ここでは、 ostechnix.txt
のコンテンツをリダイレクトしています 行数を見つけるために単語数にファイルします。
$ wc -l <ostechnix.txt 10
入力をリダイレクトするときに、stdinファイル記述子(0)を渡すこともできます。
$ wc -l 010
以下に示すように、入力リダイレクト演算子と出力リダイレクト演算子を組み合わせることができます。
$ wc -l <ostechnix.txt&> /tmp/wc.op
$ cat /tmp/wc.op 10
入力リダイレクトは、ファイルの内容を1行ずつ読み取るためにwhileループとともに使用されます。
以下の例を見てください。 / etc / passwd
を渡します while
への入力としてファイル 指図。ここでread
コマンドは行ごとに読み取り、変数 VAL
に格納します ループ条件のさらに下には、ユーザーが対応可能かどうかを確認するために書き込まれます。
VALの読み取り中; do NAME =$(echo $ VAL | awk -F ":"'/ 1 / {print $ 1}')if [[$ NAME ="karthick"]] then echo "User spotted" fidoneシステムユーザーを見つけるためのスクリプト
上記のコードの「karthick」をシステムのユーザー名に置き換えます。ファイルを保存して閉じます。
これは、ユーザーを見つけるタスクを達成するための最適な方法ではありませんが、デモンストレーションの目的では、これで十分です。
次に、スクリプトを実行可能にして実行します。
$ chmod + x ostechnix.sh$ ./ostechnix.sh
ユーザーが発見Bashは、 Heredocと呼ばれる別の形式の入力リダイレクトをサポートしています。 。詳細については、次のガイドを参照してください。
- 初心者向けのBashヒアドキュメントチュートリアル
概要
このガイドでは、Bashリダイレクトとは何か、ファイル記述子とは何か、出力をファイルにリダイレクトする方法、stderrを処理する方法、/ dev / nullとは何か、Bashでの使用方法など、いくつかの重要なスクリプトの概念を学びました。リダイレクション、そして最後にBashでの入力リダイレクションでガイドを完成させました。
Bashスクリプトを学びたい場合は、ここで説明されている概念を学び、理解する必要があります。快適にするために、この記事で示したすべてのコマンドをシステムで試してみることをお勧めします。
Linuxコミュニティと読者がbashスクリプトを学ぶのに役立つフィードバックやヒントがあれば、下のコメントセクションでお気軽にお知らせください。
推奨される読み物:
- Bashスクリプティング–例で説明されている変数
- Bashスクリプティング–例で説明されている関数
- Bashスクリプティング–例で説明されているForループ
- Bashスクリプティング–ループの説明中およびループまで
- Linuxの例で説明されているBashEchoコマンド
- 便利なBashキーボードショートカットのリスト
- エクスポートがある場合とない場合のBash変数の定義の違い