前回の投稿では、パラメータとオプションについて詳しく説明しました。今日は、シェルスクリプトに不可欠なもの、つまり入力、出力、リダイレクトについて説明します。
シェルスクリプトからの出力は、次の2つの方法で表示できます。
- 出力を画面に表示します。
- 出力をファイルに送信します。
標準ファイル記述子
すべてがLinuxのファイルであり、入力と出力が含まれます。
各プロセスでは、9つのファイル記述子を同時に開くことができます。ファイル記述子0、1、2は、bashシェルで使用するために保持されます。
0STDIN。
1STDOUT。
2STDERR。
上記のファイル記述子を使用して、入力と出力を制御できます。
これらはシェルスクリプトのバックボーンのようなものであるため、これら3つを完全に理解する必要があります。そこで、それらすべてについて詳しく説明します。
STDIN
STDINは標準入力の略で、デフォルトではキーボードです。
キーボードであるSTDINを置き換え、入力リダイレクト記号(<)を使用してファイルに置き換えることができます。これにより、データがキーボード入力として送信されます。魔法はありません!!
catコマンドを何も入力せずに入力すると、STDINからの入力を受け入れます。どの行を入力しても、catコマンドはその行を画面に出力します。
STDOUT
STDOUTは標準出力を表し、デフォルトでは画面です。
>>記号を使用して出力をファイルにリダイレクトできます。
データを含むファイルがある場合は、次のような記号を使用してデータを追加できます。
pwd >> myfile
pwdによって生成された出力は、既存のコンテンツを削除せずにmyfileに追加されます。
次のコマンドは、>記号を使用して出力をファイルにリダイレクトしようとします。
ls –l xfile > myfile
PCにxfileというファイルがないため、エラーが発生してSTDERRに送信されます。
STDERR
シェルはデフォルトでエラーを画面に送信します。
エラーを画面に送信する代わりにログファイルにリダイレクトする必要がある場合は、リダイレクト記号を使用してエラーをリダイレクトできます。
リダイレクトエラー
次のようにリダイレクト記号の前に2であるファイル記述子を配置することにより、エラーをリダイレクトできます。
ls -l xfile 2>myfile
cat ./myfile
ご覧のとおり、エラーはファイルにあり、画面には何も表示されていません。
リダイレクトエラーと通常の出力
エラーと通常の出力をリダイレクトするには、それぞれの前に次のような適切なファイル記述子を付ける必要があります。
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
lsコマンドの結果は、 1>を使用して正しいコンテンツファイルに送信されます。 シンボル。また、エラーメッセージは 2>を使用してエラーコンテンツファイルに送信されました シンボル。
&> を使用して、通常の出力とエラーを同じファイルにリダイレクトできます このような記号:
ls –l myfile xfile anotherfile &> content
ここでは、エラーと通常の出力をcontentという名前のファイルにリダイレクトします。
出力リダイレクト
出力リダイレクトには2つの方法があります:
- 一時的にリダイレクトします。
- 永続的なリダイレクト。
一時的なリダイレクト
一時的なリダイレクトの場合、次のように>&2記号を使用できます:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
したがって、実行すると、エラーがデフォルトで画面に表示されるため、両方の行が正常に印刷されます。
次のようなファイルにエラーをリダイレクトできます:
./myscript 2> myfile
シェルスクリプトは素晴らしいです!通常の出力が画面に送信されますが、>&2記号の付いたエコーメッセージはファイルにエラーを送信します。
永続的なリダイレクト
リダイレクトする必要のあるデータが多い場合は、次のようなexecコマンドを使用して永続的なリダイレクトを行うことができます。
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
outfileというファイルを見ると、エコーラインの出力が表示されます。
最初にSTDOUTをリダイレクトしますが、次のようなスクリプトの途中ではどうでしょうか:
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
execコマンドは、すべてのエラーをファイルmyerrorにリダイレクトし、標準出力を画面に送信します。
ステートメントexec1>myfileを使用して出力をmyfileファイルにリダイレクトし、最後に、エラーは>&2記号を使用してmyerrorファイルに送られます。
入力のリダイレクト
次のようなexecコマンドを使用して、入力をSTDINではなくファイルにリダイレクトできます。
exec 0< myfile
このコマンドは、STDINではなくmyfileというファイルから入力を取得するようにシェルに指示します。例を次に示します。
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
シェルスクリプトは簡単です。
readコマンドを使用してユーザー入力を取得する方法を知っています。 STDINをファイルにリダイレクトすると、readコマンドはファイルを指すSTDINからの読み取りを試みます。
一部のLinuxシステム管理者は、この手法を使用してログファイルを読み取って処理します。今後の投稿のログを専門的な方法で読み取るためのその他の方法について説明します。
カスタムリダイレクトの作成
9つのファイル記述子があることを知っていますが、入力、出力、およびエラーに使用するのはそのうちの3つだけです。
残りの6つのファイル記述子は、入力および出力のリダイレクトに使用できます。
execコマンドを使用して、次のように出力用のファイル記述子を割り当てることができます。
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
入力ファイル記述子の作成
入力ファイル記述子をリダイレクトするには、次のようにします。
1-STDINを別のファイル記述子に保存します。
2-ファイルにリダイレクトします。
3-STDINを元の場所に戻します。
これらの手順を理解するには、次のコードを参照してください。
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
STDINをファイル記述子7に保存し、STDINをファイルにリダイレクトしました。
STDINは、ファイル行を繰り返し処理した後、元の場所に戻りました。
STDINが元に戻され、キーボードを正常に使用できることを確認するための最後の読み取りコマンド。
ファイル記述子を閉じる
スクリプトが終了すると、ファイル記述子は自動的に閉じます。ファイル記述子を自分で閉じたい場合は、ファイル記述子をこのシンボルにリダイレクトします&- 閉鎖されます。
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
ご覧のとおり、ファイル記述子が存在しないため、ファイル記述子が正しくないというエラーが発生します。
lsofコマンド
lsofコマンドは、システムおよびバックグラウンドプロセスで開いているすべてのファイルを一覧表示するために使用されます。
Fedoraのような多くのLinuxシステムでは、lsofコマンドは/ usr/sbinの下にあります。
これは、lsofコマンドの重要なオプションの一部です。
-p:プロセスID用。
-d:ファイル記述子用。
$$変数を使用してプロセスPIDを取得できます。
-aを使用して、-pオプションと-dオプションの結果を組み合わせることができます。
次に、スクリプトからコマンドをテストします。
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
シェルスクリプトは、書き込み用に4と5、読み取り用に6のファイル記述子を作成します。
コマンド出力の抑制
出力を見たくない場合があります。出力をブラックホールにリダイレクトします これは/dev / null 。
たとえば、次のようなエラーを抑制できます。
ls -al badfile anotherfile 2> /dev/null
同じコマンドを使用して、ファイルを完全に削除せずに切り捨てることができます。
cat /dev/null > myfile
これで、入力、出力、それらをリダイレクトする方法、ファイル記述子を作成する方法、およびそれにリダイレクトする方法を理解できました。
あなたが楽しんでくれることを望みます。戻ってきてください。
ありがとうございます。