ターミナル(Bash)コマンドの出力をテキストファイルに保存する方法。 標準入力/出力ストリームのリダイレクト標準出力をファイルにリダイレクト

システムでは、デフォルトで、(キーボード)、(画面)、(画面にエラーメッセージを表示する)の3つの「ファイル」が常に開いています。 これら、およびその他の開いているファイルは、リダイレクトできます。 この場合、「リダイレクト」という用語は、ファイル、コマンド、プログラム、スクリプト、またはスクリプト内の別のブロックから出力を受け取り(例3-1および例3-2を参照)、それを別の入力に転送することを意味します。ファイル、コマンド、プログラム、またはスクリプト。

開いている各ファイルには、ファイル記述子が関連付けられています。 ファイル記述子、およびはそれぞれ0、1、および2です。 追加のファイルが開かれると、記述子3から9は使用されないままになります。 場合によっては、またはへの参照を一時的に保存することで、追加の記述子が適切に機能することがあります。 これにより、複雑なリダイレクトと順列操作の後で、ハンドルを通常の状態に戻すことが容易になります(例16-1を参照)。

COMMAND_OUTPUT> #stdout(出力)をファイルにリダイレクトします。 #ファイルが欠落している場合は作成され、そうでない場合は上書きされます。 ls -lR> dir-tree.list#ディレクトリツリーリストを含むファイルを作成します。 :> filename#>操作は、ファイル「filename」を長さゼロに切り捨てます。 #操作前にファイルが存在しなかった場合は、#長さがゼロの新しいファイルが作成されます(「touch」コマンドでも同じ効果が得られます)。 #記号:ここでは何も出力せずにプレースホルダーとして機能します。 > filename#>操作は、ファイル「filename」を長さゼロに切り捨てます。 #操作前にファイルが存在しなかった場合は、#長さがゼロの新しいファイルが作成されます(「touch」コマンドでも同じ効果が得られます)。 #(上記と同じ結果-":>"ですが、このオプションは#一部のシェルでは機能しません。)COMMAND_OUTPUT >>#stdout(出力)をファイルにリダイレクトします。 #存在しない場合は新しいファイルを作成し、存在しない場合は-ファイルの末尾に追加します。 #1行のリダイレクトコマンド#(それらが発生する行にのみ影響します):#——————————————————————————————— ———— 1> filename#ファイル "filename"へのリダイレクト(stdout)を出力します。 1 >> filename#出力(stdout)をファイル「filename」にリダイレクトします。ファイルは追加モードで開かれます。 2> filename#stderrを「filename」にリダイレクトします。 2 >> filename#stderrをファイル "filename"にリダイレクトし、ファイルを追加モードで開きます。 &> filename#stdoutとstderrを「filename」にリダイレクトします。 #================================================= ==============================#stdoutをリダイレクトします。1行のみです。 LOGFILE = script.log echo "この行はファイル\" $ LOGFILE \ "に書き込まれます。" 1> $ LOGFILE echo "この行は、\" $ LOGFILE \ "ファイルの末尾に追加されます。" 1 >> $ LOGFILE echo "この行は、\" $ LOGFILE \ "ファイルの末尾にも追加されます。" 1 >> $ LOGFILE echo "この行は画面に出力され、ファイル\" $ LOGFILE \ "には移動しません。" #各行の後で、行われたリダイレクトは自動的に「フラッシュ」されます。 #stderrを1行のみリダイレクトします。 ERRORFILE = script.errors bad_command1 2> $ ERRORFILE#エラーメッセージは$ ERRORFILEに書き込まれます。 bad_command2 2 >> $ ERRORFILE#エラーメッセージは$ ERRORFILEの最後に追加されます。 bad_command3#エラーメッセージはstderr、#+に出力され、$ ERRORFILEには送信されません。 #各行の後で、行われたリダイレクトも自動的に「フラッシュ」されます。 #================================================= ============================= 2>&1#stderrをstdoutにリダイレクトします。 #エラーメッセージは、標準出力と同じ場所に送信されます。 i> v NS..。 #記述子を使用してファイルに出力 記述子とともにファイルに渡されます NS..。 >&j#記述子を使用してファイルをリダイレクトする 1 (stdout)記述子を使用してファイルする NS..。 #stdoutへの出力は記述子付きのファイルに転送されます NS. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">"、多くの場合それと組み合わせて。## grep search-word filename#ファイル "filename"は読み取りと書き込みのために開かれ、記述子 "j"に関連付けられています。 #「ファイル名」がない場合は作成されます。 #記述子 "j"が指定されていない場合、デフォルトで記述子0、stdinが使用されます。 ##これの1つの使用法は、ファイル内の特定の位置に書き込むことです。 echo 1234567890>ファイル#ファイル「ファイル」に行を書き込みます。 exec 3<>ファイル#「ファイル」を開き、ハンドル3にリンクします。read-n4<&3 # Прочитать 4 символа. echo -n . >&3#ドット文字を書き込みます。 exec 3>&-#記述​​子3を閉じます。catファイル#==> 1234.67890#ランダムアクセスなど! | #コンベヤー(チャネル)。 #コマンドを1つのチェーンに結合するためのユニバーサルツール。 # ">"に似ていますが、実際にはもっと広範囲です。 #コマンド、スクリプト、ファイル、およびプログラムを1つのチェーン(パイプライン)に結合するために使用されます。 cat * .txt | 並べ替え| uniq> result-file#すべての.txtファイルの内容が並べ替えられ、重複する行が削除され、#結果が「result-file」ファイルに保存されます。

リダイレクト操作やパイプラインは、1つのコマンドラインで組み合わせることができます。

指図< input-file >出力ファイルcommand1 | command2 | command3> output-file例12-23および例A-17を参照してください。

複数のストリームを1つのファイルにリダイレクトできます。

ls -yz >> command.log 2>&1#「ls」コマンドの無効な「yz」オプションに関するメッセージが「command.log」ファイルに書き込まれます。 #stderrはファイルにリダイレクトされるため。

ファイル記述子を閉じる

入力ファイルへのハンドルを閉じます。

0<&-, <&-

出力ファイルへのハンドルを閉じます。

1>&-, >&-

子プロセスは、開いているファイル記述子を継承します。 このため、コンベヤーは機能します。 記述子の継承を防ぐには、子プロセスを開始する前に記述子を閉じてください。

#stderrのみがパイプラインに渡されます。 exec 3>&1#stdoutの現在の「状態」を保存します。 ls -l 2>&1>&3 3>&-| grep bad 3>&-#説明を閉じます。 grepの場合は3(ただし、lsは除く)。 #^^^^ ^^^^ exec 3>&-#スクリプトの残りの部分で閉じます。 #ありがとうS.C.

I / Oのリダイレクトの詳細については、付録Dを参照してください。

16.1。 コマンドの使用 exec

指示 exec 入力をからファイルにリダイレクトします。 今後、(通常はキーボード)ではなく、すべての入力がこのファイルから行われます。 これにより、ファイルの内容を1行ずつ読み取り、sedやawkを使用して入力された各行を解析できます。

例16-1。 execによるリダイレクト

#!/ bin / bash#「exec」を使用してstdinをリダイレクトします。 exec 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

同様に、建設 exec>ファイル名指定されたファイルに出力をリダイレクトします。 その後、通常は送信されるコマンドからのすべての出力がこのファイルに出力されます。

例16-2。 execによるリダイレクト

#!/ bin / bash#reassign-stdout.sh LOGFILE = logfile.txt exec 6>&1#リンクの説明。 stdoutから#6。 #stdoutを維持します。 exec> $ LOGFILE#stdoutは「logfile.txt」に置き換えられます。 #————————————————————— ##このブロックのすべてのコマンド出力は$ LOGFILEファイルに書き込まれます。 echo -n "ログファイル:" date echo "————————————-" echoecho "コマンドの出力\" ls -al \ "" echo ls -al echo; echo echo "\" df \ "からの出力" "echo df#————————————————————#exec 1>&6 6>&-#stdoutを復元してdescrを閉じる。 #6。 echo echo "== stdoutがデフォルトに復元されました==" echo ls -al echo exit 0

例16-3。 同時デバイスリダイレクト、およびexecコマンドの使用

#!/ bin / bash#upperconv.sh#入力ファイルの文字を大文字に変換します。 E_FILE_ACCESS = 70 E_WRONG_ARGS = 71 if [! -r "$ 1"]#ファイルは読み取り可能ですか? 次に、「指定されたファイルから読み取ることができません!」とエコーします。 echo "使用順序:$ 0入力ファイル出力ファイル" exit $ E_FILE_ACCESS fi#入力ファイル($ 1)が指定されていない場合#+終了コードは同じになります。 if [-z "$ 2"] then echo "出力ファイルを指定する必要があります。" echo "使用順序:$ 0入力ファイル出力ファイル" exit $ E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>&1 exec> $ 2#出力を出力ファイルに割り当てます。 #出力ファイルが書き込み可能であると想定します#(チェックを追加しますか?)。 #————————————————猫-| tr a-z A-Z#大文字変換#^^^^^#stdinから読み取ります。 #^^^^^^^^^^#stdoutに書き込みます。 #ただし、stdinとstdoutの両方がリダイレクトされています。 #————————————————— exec 1>&7 7>&-#stdoutを復元します。 exec 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

次:エラーをファイルにリダイレクトする 上: I / Oリダイレクト 前:ファイルからの入力のリダイレクト コンテンツ 索引

出力をファイルにリダイレクトする

`> '演算子を使用して、標準出力をファイルにリダイレクトします。

Linux I / Oリダイレクト

コマンド名の後に>演算子を使用し、その後に出力先として機能するファイルの名前を続けます。 たとえば、プログラムの結果の出力をファイルに書き込むには、次のように入力します。

標準出力を既存のファイルにリダイレクトすると、最初から上書きされます。 既存のファイルの内容に標準出力を追加するには、 `''演算子を使用する必要があります。 たとえば、プログラムの再起動時に作業の結果をファイルに追加するには、次のように入力します。

アレックスオトワギン2002-12-16

プログラムは通常、データを処理できるという点で価値があります。1つを受信し、もう1つを出力し、事実上すべてがデータとして機能します。テキスト、数値、音声、ビデオ...コマンドの入力および出力データストリームは呼び出されます。 入力出力..。 各プログラムは、複数の入力ストリームと出力ストリームを持つことができます。 各プロセスでは、作成時に必ず、いわゆる 標準入力(標準入力、stdin)および stdout(標準出力、stdout)および 標準エラー出力(標準エラー、stderr)。

標準のI / Oストリームは、主にテキスト情報の交換を目的としています。 誰がテキストの助けを借りて通信するかは問題ではありません。プログラムまたはプログラムを相互に持つ人です。主なことは、データ伝送チャネルがあり、「同じ言語」を話すことです。

マシンでの作業のテキストの原則により、システムキーボードやモニター付きのビデオカードなど、コンピューターの特定の部分から注意をそらすことができます。 ターミナルデバイス、ユーザーがテキスト(コマンド)を入力してシス​​テムに転送すると、システムはユーザーに必要なデータとメッセージ(診断とエラー)を表示します。 そのようなデバイスはと呼ばれます ターミナル..。 一般に、端末は、テキスト情報を送信する機能を持つシステムへのユーザーのエントリポイントです。 端末は、シリアルデータポート(パーソナルコンピュータでは「COMポート」と呼ばれます)を介してコンピュータに接続された別個の外部デバイスにすることができます。 プログラム(たとえば、xtermやssh)は、端末の役割でも機能します(システムからのサポートがあります)。 ついに、 仮想コンソール-また、最新のコンピューターの適切なデバイスの助けを借りてプログラムでのみ編成された端末。

コマンドラインで作業する場合、シェルの標準入力はキーボードに関連付けられ、標準出力とエラー出力はモニター画面(またはターミナルエミュレーターウィンドウ)に関連付けられます。 最も単純なコマンドの例であるcatを示しましょう。 通常、コマンド パラメータとして指定されているすべてのファイルからデータを読み取り、その読み取り値を標準出力(stdout)に直接送信します。 したがって、コマンド

/ホーム/ラリー/論文#猫の歴史-ファイナルマスター-論文

最初にファイルの内容を表示し、次にファイルを表示します。

ただし、ファイル名が指定されていない場合、プログラムは stdinから入力を読み取り、すぐにstdoutに返します(変更せずに)。 データは通過します パイプを通してのように。 次に例を示します。

/ホーム/ラリー/ペーパー#猫こんにちは。 こんにちは。 さよなら。 さよなら。 NSNS/ホーム/ラリー/ペーパー#

キーボードから入力したすべての行は、猫によってすぐに画面に戻されます。 標準入力から情報を入力する場合、通常は特別なキーの組み合わせを入力することにより、テキストの終わりが通知されます。 NSNS.

別の例を見てみましょう。 指示 選別入力テキストの行を読み取り(ファイル名が指定されていない場合はstdinからも)、これらの行のセットを順序付けられた形式でstdoutに出力します。 その効果を確認してみましょう。

/ home / larry / papers#バナナにんじんりんごを並べ替えるCtrl + Dりんごバナナにんじん/ home / larry / papers#

ご覧のとおり、クリックすると NSNS, 選別行をアルファベット順に印刷しました。

標準入力と標準出力

アルファベット順のリストをディスクに保存するために、sortコマンドの出力をファイルにパイプするとします。 コマンドシェルを使用すると、シンボルを使用してコマンドの標準出力をファイルにリダイレクトできます。 次に例を示します。

/ホーム/ラリー/ペーパー#並べ替え>ショッピングリストバナナニンジンリンゴ NSNS/ホーム/ラリー/ペーパー#

sortコマンドの出力は表示されていませんが、という名前のファイルに保存されていることがわかります。 このファイルの内容を表示してみましょう。

/ホーム/ラリー/ペーパー#猫の買い物-リストリンゴバナナニンジン/ホーム/ラリー/ペーパー#

ここで、元の順序付けされていないリストがファイルにあるとしましょう。 このリストは、コマンドを使用して並べ替えることができます 選別標準入力からではなく、指定されたファイルから読み取る必要があることを彼女に伝え、さらに、上記のように標準出力をファイルにリダイレクトする場合。 例:

/ホーム/ラリー/ペーパー#アイテムの並べ替えショッピングリスト/ホーム/ラリー/ペーパー#猫のショッピングリストリンゴバナナニンジン/ホーム/ラリー/ペーパー#

ただし、標準出力だけでなく、リダイレクトすることで、別の方法で行うこともできます。 標準入力記号を使用したファイルからのユーティリティ:

/ホーム/ラリー/ペーパー#並べ替え< items apples bananas carrots /home/larry/papers#

コマンド結果 選別< items コマンドと同等 アイテムを並べ替えるただし、最初の例は次のことを示しています。コマンドを発行するとき 選別< items システムは、ファイルに含まれるデータが標準入力から入力されたかのように動作します。 リダイレクトはシェルによって行われます。 チーム 選別ファイル名は報告されませんでした。このコマンドは、キーボードから入力する場合と同じように、標準入力からデータを読み取ります。

コンセプトを紹介しましょう フィルター..。 フィルタは、標準入力からデータを読み取り、それを何らかの方法で処理し、その結果を標準出力に送信するプログラムです。 リダイレクトを使用すると、ファイルを標準の入力および出力として使用できます。 上記のように、デフォルトでは、stdinとstdoutはそれぞれキーボードと画面を指します。 ソートプログラムは単純なフィルターです—入力をソートし、結果を標準出力に送信します。 非常に単純なフィルターはプログラムです -入力データには何もせず、出力に送信するだけです。

上記のフィルターとしてソートプログラムを使用する方法については、すでに説明しました。 これらの例では、元のデータが何らかのファイルにあるか、元のデータがキーボード(標準入力)から入力されることを前提としています。 ただし、他のコマンドの結果であるデータを並べ替える場合はどうなりますか。 ls?

データをアルファベットの逆順に並べ替えます。 これは、コマンドのオプションとして実行されます 選別..。 現在のディレクトリ内のファイルをアルファベットの逆順で一覧表示する場合、1つの方法は次のようになります。

I / Oリダイレクト

最初にコマンドを適用しましょう ls:

/ホーム/ラリー/論文#ls英語-リストの歴史-ファイナルマスター-論文ノート/ホーム/ラリー/論文#

コマンド出力をリダイレクトします ls file-listという名前のファイルに

/ home / larry / papers#ls> file-list / home / larry / papers#sort -r file-list notes masters-thesis history-final english-list / home / larry / papers#

これがコマンド出力です lsファイルに保存され、その後、このファイルはコマンドによって処理されました 選別..。 ただし、このパスは扱いにくく、プログラムの出力を格納するために一時ファイルを使用する必要があります。 ls.

この状況での解決策は、作成することです ドッキングされたチーム(パイプライン)。 ドッキングはコマンドシェルによって実行されます。コマンドシェルは、最初のコマンドのstdoutを2番目のコマンドのstdinに転送します。 この場合、コマンドのstdoutをパイプ処理します lsコマンドのstdinに 選別..。 次の例に示すように、ドックは記号を使用します。

/ホーム/ラリー/ペーパー#ls | sort -r notes masters-論文の歴史-最終英語-リスト/ホーム/ラリー/論文#

このコマンドは、コマンドのコレクションよりも短く、入力が簡単です。

別の便利な例を見てみましょう。 指示

/ホーム/ラリー/ペーパー#ls / usr / bin

ファイルの長いリストを生成します。 このリストのほとんどは、このリストの内容を読み取るには速すぎて画面を横切って移動します。 moreコマンドを使用して、このリストをチャンクで表示してみましょう。

/ホーム/ラリー/ペーパー#ls / usr / bin | もっと

これで、このリストを「裏返す」ことができます。

さらに進んで、3つ以上のチームをドッキングできます。 コマンドを検討してください 、これは次のプロパティのフィルターです。入力ストリームから最初の行を出力します(この場合、入力はいくつかのドッキングされたコマンドからの出力になります)。 現在のディレクトリの最後のアルファベット順のファイル名を表示する場合は、次の長いコマンドを使用できます。

/ホーム/ラリー/ペーパー#ls | sort -r | 頭-1ノート/ホーム/ラリー/ペーパー\#

チームはどこですか 受信した行の入力ストリームの最初の行を表示します(この場合、ストリームはコマンドからのデータで構成されます ls)アルファベットの逆順でソートされます。

連結コマンドの使用(パイプライン)

文字を使用してファイル出力をリダイレクトする効果は破壊的です。 言い換えれば、コマンド

/ホーム/ラリー/ペーパー#ls>ファイルリスト

このファイルが以前に存在していた場合は、ファイルの内容を破棄し、その場所に新しいファイルを作成します。

代わりに文字を使用してリダイレクトが行われる場合、出力は、ファイルの元の内容を破壊することなく、指定されたファイルの末尾に追加されます。 たとえば、コマンド

/ホーム/ラリー/ペーパー#ls >>ファイルリスト

コマンドの出力に起因します lsファイルの最後まで。

入力と出力のリダイレクトとコマンドの連結の両方が、および文字をサポートするシェルによって処理されることに注意してください。 コマンド自体は、これらの記号を認識して解釈することはできません。

非破壊的な出力リダイレクト

このような何かがあなたがそれをしたいことをするべきですか?

それをチェックしてください:wintee

cygwinは必要ありません。

しかし、私は遭遇し、いくつかの問題を報告しました。

また、http://unxutils.sourceforge.net/にはteeが含まれている(そしてcygwinは必要ない)ので確認できますが、EOL出力がUNIXに似ていることに注意してください。

最後になりましたが、PowerShellをお持ちの場合は、Tee-Objectを試すことができます。 詳細については、PowerShellコンソールに入力してください。

少し醜いですが、これは機能します。

独自の方法で機能するため、他のいくつかのソリューションよりも少し柔軟性があり、追加に使用できます。

私はこれをバッチファイルでメッセージのログ記録と表示に非常によく使用します。

はい、ECHOステートメントを繰り返すことができます(画面に対して1回、ログファイルに2回リダイレクトする)が、それは同じように悪く見え、メンテナンスの問題です。

入力と出力のリダイレクト

少なくともこの方法では、2か所でメッセージに変更を加える必要はありません。

_は単なる短いファイル名であるため、バッチファイルの最後で削除する必要があることに注意してください(バッチファイルを使用している場合)。

これにより、現在の時刻と時刻を含むログファイルが作成され、プロセス中にコンソール行を使用できます。

Windows環境パスにcygwinがある場合は、次を使用できます。

単純なC#コンソールアプリケーションでうまくいきます。

これを使用するには、元のコマンドをプログラムに渡し、出力を複製するファイルへのパスを指定するだけです。 例えば:

検索結果を表示し、files1.txtファイルとfiles2.txtファイルに結果を保存します。

エラー処理パスには多く(何もない!)があり、複数のファイルのサポートが必要ない場合があることに注意してください。

私も同じ解決策を探していました。少し試してみたところ、コマンドラインでこれを正常に実行できました。 これが私の解決策です:

一時停止チームもキャプチャします。

別の方法は、プログラム内のstderrのteestdoutです。

次に、dosバッチファイルで:

Stdoutはログファイルに移動し、stderr(同じデータ)がコンソールに表示されます。

出力を表示してファイルにリダイレクトする方法。 dosコマンドdir> test.txtを使用すると、そのコマンドは結果を表示せずに出力をtest.txtにリダイレクトするとします。 DOS、つまりUNIX / LINUXではなくWindowsコマンドラインを使用して、出力を出力し、出力をファイルにリダイレクトするコマンドを作成する方法。

これらのコマンドは、biterscripting(http://www.biterscripting.com)で役立つ場合があります。

これは以前のMTSの回答のバリエーションですが、他の人が役立つと思われる機能がいくつか追加されています。 これが私が使用した方法です:

  • コマンドは変数として設定され、コードの後半で使用してコマンドウィンドウに出力し、を使用してログファイルに追加できます。
    • チームが最初に評価されないように、チームはニンジンシンボルを使用したリダイレクトを回避します
  • 一時ファイルは、コマンドラインパラメータ展開構文を使用してバッチファイルの名前を取得するという名前のバッチファイルと同様のファイル名で作成されます。
  • 結果は別のログファイルに追加されます

コマンドのシーケンスは次のとおりです。

  1. 出力メッセージとエラーメッセージは一時ファイルに送信されます
  2. その場合、一時ファイルの内容は次のようになります。
    • ログファイルに追加
    • コマンドウィンドウへの出力
  3. 一時メッセージファイルが削除されます

次に例を示します。

したがって、コマンドは、後のコマンドの後に、はるかにきれいに見えるバッチファイルに簡単に追加できます。

これは、他のコマンドの最後に追加することもできます。 私の知る限り、これはメッセージに複数の行がある場合に機能します。 たとえば、次のコマンドは、エラーメッセージがある場合に2行を出力します。

私はBrianRasmussenに同意します。これを行うには、unxutilsポートが最も簡単な方法です。 スクリプトページのバッチファイルセクションで、Rob van derWoudeがMS-DOSおよびCMDコマンドの使用に関する豊富な情報を提供しています。 あなたの問題には独自の解決策があるのではないかと思いました。そこでTEE.BATを調べたところ、TEE.BATがMS-DOS言語でパッケージ化された言語パックであることがわかりました。 これはかなり複雑なバッチファイルであり、私はunxutilsポートを使用する傾向があります。

私はほとんどのマシンにperlをインストールしているので、答えはperl:tee.plです。

dir | perltee.plまたはディレクトリ| perl tee.pl dir.bat

生でテストされていません。

コマンドラインスクリプトが出力するものを操作する2つの方法にすでに精通しています。

  • 画面に出力データを表示します。
  • 出力をファイルにリダイレクトします。
画面に何かを表示したり、ファイルに何かを書き込んだりする必要がある場合があるため、Linuxでの入出力の処理方法を理解する必要があります。つまり、スクリプトの結果をどこに送信するかを学ぶ必要があります。する必要があります。 標準のファイル記述子について説明することから始めましょう。

標準ファイル記述子

Linuxのすべては、入力と出力を含むファイルです。 オペレーティングシステムは、記述子を使用してファイルを識別します。

各プロセスには、最大9つのオープンファイル記述子を含めることができます。 bashシェルは、ID 0、1、および2の最初の3つの記述子を予約します。これらの意味は次のとおりです。

  • 0、STDIN-標準の入力ストリーム。
  • 1、STDOUT-標準出力ストリーム。
  • 2、STDERR-標準エラーストリーム。
これらの3つの特別な記述子は、スクリプトの入力と出力を処理します。
標準ストリームをよく理解する必要があります。 それらは、スクリプトと外界との相互作用が構築されている基盤と比較することができます。 それらの詳細を考えてみましょう。

STDIN

STDINは、シェルの標準入力です。 端末の場合、標準入力はキーボードです。 スクリプトが入力リダイレクト文字を使用する場合-< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

多くのbashコマンドは、データを取得するファイルがコマンドラインで指定されていない限り、STDINからの入力を受け入れます。 たとえば、これはcatコマンドに当てはまります。

パラメータを指定せずにコマンドラインでcatと入力すると、STDINからの入力を受け入れます。 別の行を入力すると、catはそれを画面に出力するだけです。

STDOUT

STDOUTは、シェルの標準出力です。 デフォルトでは、これは画面です。 ほとんどのbashコマンドはデータをSTDOUTに出力します。これにより、データがコンソールに表示されます。 >>コマンドを使用してデータをその内容に添付することにより、データをファイルにリダイレクトできます。

したがって、次のコマンドを使用して他のデータを追加できる特定のデータファイルがあります。

Pwd >> myfile
どのpwdが出力するかは、データがまだ存在しない状態でmyfileに追加されます。

コマンド出力をファイルにリダイレクトする

これまでのところ良好ですが、存在しないxfileにアクセスして以下のようなことを行おうとすると、myfileにエラーメッセージが表示されるようになります。

Ls –l xfile> myfile
このコマンドを実行すると、画面にエラーメッセージが表示されます。


存在しないファイルにアクセスしようとしました

存在しないファイルにアクセスしようとするとエラーが発生しますが、シェルはエラーメッセージを表示してファイルにリダイレクトしませんでした。 しかし、エラーメッセージをファイルに送信する必要がありました。 何をすべきか? 答えは簡単です。3番目の標準記述子を使用してください。

STDERR

STDERRは、シェルの標準エラーストリームです。 デフォルトでは、この記述子はSTDOUTポイントと同じものを指します。そのため、エラーが発生すると、画面にメッセージが表示されます。

したがって、エラーメッセージを画面に表示するのではなく、ログファイルなどにリダイレクトするとします。

▍リダイレクトエラーストリーム

すでにご存知のとおり、ファイル記述子はSTDERR 2です。リダイレクトコマンドの前にこの記述子を配置することで、エラーをリダイレクトできます。

Ls -l xfile 2> myfile cat ./myfile
エラーメッセージはmyfileに送られます。


エラーメッセージをファイルにリダイレクトする

▍エラーと出力ストリームのリダイレクト

コマンドラインスクリプトを作成するときに、エラーメッセージリダイレクトと標準出力リダイレクトの両方を調整する必要がある状況が発生する場合があります。 これを実現するには、対応する記述子に対してリダイレクトコマンドを使用して、エラーと標準出力が送信されるファイルを指定する必要があります。

Ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent

エラーとstdoutのリダイレクト

シェルは、1>構文のおかげで、lsコマンドが通常STDOUTに送信するものを正しいコンテンツファイルにリダイレクトします。 2> redirectionコマンドが原因で、STDERRで終了するはずだったエラーメッセージがerrorcontentファイルで終了します。

必要に応じて、&>コマンドを使用してSTDERRとSTDOUTの両方を同じファイルにリダイレクトできます。


STDERRとSTDOUTを同じファイルにリダイレクトする

コマンドを実行すると、STDERRおよびSTDOUTを対象としたものがファイルの内容に表示されます。

スクリプトでの出力のリダイレクト

コマンドラインスクリプトで出力をリダイレクトするには、次の2つの方法があります。
  • 一時的なリダイレクト、または1行の出力のリダイレクト。
  • スクリプト内の出力の全部または一部を永続的にリダイレクトまたはリダイレクトします。

▍出力を一時的にリダイレクトする

スクリプトでは、1行の出力をSTDERRにリダイレクトできます。 これを行うには、STDERR記述子を指定してリダイレクトコマンドを使用するだけで十分であり、アンパサンド文字(&)を記述子番号の前に配置する必要があります。

#!/ bin / bash echo "これはエラーです">&2 echo "これは通常の出力です"
スクリプトを実行すると、両方の行が画面に表示されます。これは、既にご存知のとおり、デフォルトでは、エラーは通常のデータと同じ場所に表示されるためです。


一時的なリダイレクト

STDERR出力がファイルに送られるようにスクリプトを実行してみましょう。

./myscript 2> myfile
ご覧のとおり、これで通常の出力がコンソールに実行され、エラーメッセージがファイルに送信されます。


エラーメッセージはファイルに書き込まれます

▍永続的な出力リダイレクト

スクリプトが大量の出力を画面にリダイレクトする必要がある場合、各エコー呼び出しに適切なコマンドを追加するのは不便です。 代わりに、execコマンドを使用して、スクリプトの実行中に特定の記述子にリダイレクトされるように出力を設定できます。

#!/ bin / bash exec 1> outfile echo "これはすべての出力をリダイレクトするテストです" echo "シェルスクリプトから別のファイルに" 「すべての行をリダイレクトする必要なしに」エコー
スクリプトを実行してみましょう。


すべての出力をファイルにリダイレクトする

output redirectionコマンドで指定されたファイルを見ると、echoコマンドで出力されたものがすべてこのファイルになっていることがわかります。

execコマンドは、スクリプトの先頭だけでなく、他の場所でも使用できます。

#!/ bin / bash exec 2> myerror echo "これはスクリプトの始まりです" echo "すべての出力を別の場所にリダイレクトします" exec 1> myfile echo "これはmyfileファイルに移動する必要があります" echo "そしてこれは移動する必要がありますmyerrorファイルへ ">&2
これは、スクリプトを実行し、出力のリダイレクト先のファイルを表示した後に発生します。


出力を別のファイルにリダイレクトする

execコマンドは、最初にSTDERRからの出力をファイルmyerrorにリダイレクトします。 次に、いくつかのエコーコマンドの出力がSTDOUTに送信され、画面に出力されます。 その後、execコマンドはSTDOUTに送信されるものをすべてmyfileに送信するように設定し、最後にechoコマンドでredirect to STDERRコマンドを使用します。これにより、対応する行がmyerrorに書き込まれます。

これをマスターすると、出力を目的の場所にリダイレクトできるようになります。 それでは、入力リダイレクトについて説明しましょう。

スクリプトでの入力のリダイレクト

入力をリダイレクトするには、出力のリダイレクトに使用したのと同じ手法を使用できます。 たとえば、execコマンドを使用すると、STDINのファイルソースを作成できます。

Exec 0< myfile
このコマンドは、通常のSTDINではなく、myfileから入力を取得するようにシェルに指示します。 実際の入力リダイレクトを見てみましょう。

#!/ bin / bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
これは、スクリプトの実行後に画面に表示されるものです。


入力のリダイレクト

以前の記事の1つで、readコマンドを使用してキーボードからユーザー入力を読み取る方法を学びました。 入力をリダイレクトしてデータソースをファイルにすると、readコマンドはSTDINからデータを読み取ろうとすると、キーボードからではなくファイルからデータを読み取ります。

一部のLinux管理者は、このアプローチを使用してログファイルを読み取って処理します。

独自の出力リダイレクトを作成する

スクリプトで入力と出力をリダイレクトする場合、3つの標準ファイル記述子に制限されません。 前述のように、最大​​9つのオープン記述子を使用できます。 3から8までの番号が付けられた他の6つは、入力または出力をリダイレクトするために使用できます。 それらのいずれかをファイルに割り当てて、スクリプトコードで使用できます。

execコマンドを使用して、データ出力用の記述子を割り当てることができます。

#!/ bin / bash exec 3> myfile echo "これは画面に表示されます" echo "そしてこれはファイルに保存されます">&3 echo "そしてこれは画面に戻るはずです"
スクリプトの実行後、出力の一部は画面に表示され、一部は記述子3のファイルに表示されます。


カスタム記述子を使用した出力のリダイレクト

データ入力用のファイル記述子の作成

スクリプトの入力は、出力と同じ方法でリダイレクトできます。 入力をリダイレクトする前に、STDINを別の記述子に格納します。

ファイルの読み取りが終了したら、STDINを復元して、通常どおりに使用できます。

#!/ bin / bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
スクリプトをテストしてみましょう。


入力のリダイレクト

この例では、ファイル記述子6を使用してSTDINへの参照を格納しました。 次に、入力リダイレクトが実行され、ファイルがSTDINのデータソースになりました。 その後、読み取りコマンドの入力は、リダイレクトされたSTDIN、つまりファイルから行われました。

ファイルを読み取った後、記述子6にリダイレクトすることにより、STDINを元の状態に戻します。 ここで、すべてが正しく機能していることを確認するために、スクリプトはユーザーに質問をし、キーボード入力を待ち、入力された内容を処理します。

ファイル記述子を閉じる

スクリプトが終了すると、シェルはファイル記述子を自動的に閉じます。 ただし、場合によっては、スクリプトが作業を終了する前に、記述子を手動で閉じる必要があります。 ハンドルを閉じるには、&-にリダイレクトする必要があります。 これは次のようになります。

#!/ bin / bash exec 3> myfile echo "これはデータのテスト行です">&3 exec 3>&-echo "This won" t work ">&3
スクリプトを実行すると、エラーメッセージが表示されます。


プライベートファイル記述子へのアクセスを試みます

重要なのは、存在しない記述子にアクセスしようとしたことです。

スクリプト内のファイル記述子を閉じるときは注意してください。 データをファイルに送信し、ハンドルを閉じてから再度開いた場合、シェルは既存のファイルを新しいファイルで上書きします。 つまり、以前にこのファイルに書き込まれたものはすべて失われます。

オープン記述子に関する情報の取得

lsofコマンドを使用して、Linuxで開いているすべてのハンドルのリストを取得できます。 Fedoraのような多くのディストリビューションでは、lsofユーティリティは/ usr / sbinにあります。 このコマンドは、システムで開いている各ハンドルに関する情報を表示するため、非常に便利です。 これには、バックグラウンドで実行されているプロセスによって開かれるものと、ログインしているユーザーによって開かれるものが含まれます。

このコマンドには多くのキーがあります。最も重要なキーを見てみましょう。

  • -pプロセスIDを指定できます。
  • -d情報を取得する記述子の番号を指定できます。
現在のプロセスのPIDを見つけるために、シェルが現在のPIDを書き込む特別な環境変数$$を使用できます。

-aスイッチは、他の2つのスイッチを使用して返された結果に対して論理AND演算を実行するために使用されます。

Lsof -a -p $$ -d 0,1,2

開いている記述子に関する情報の表示

STDIN、STDOUT、およびSTDERRに関連付けられているファイルのタイプはCHR(文字モード)です。 これらはすべて端末を指しているため、ファイル名は端末に割り当てられているデバイス名と一致します。 3つの標準ファイルはすべて、読み取りと書き込みに使用できます。

スクリプトからのlsofコマンドの呼び出しを見てみましょう。ここでは、標準に加えて、他の記述子が開かれています。

#!/ bin / bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
これは、このスクリプトを実行した場合に発生することです。


スクリプトによって開かれたファイル記述子の表示

スクリプトは、出力用に2つの記述子(3と6)を開き、入力用に1つ(7)を開きました。 記述子の構成に使用されるファイルへのパスもここに表示されます。

出力抑制

たとえば、バックグラウンドプロセスとして実行できるスクリプト内のコマンドが、画面に何も表示されないようにする必要がある場合があります。 これを行うには、出力を/ dev / nullにリダイレクトできます。 これは「ブラックホール」のようなものです。

たとえば、エラーメッセージの出力を抑制する方法は次のとおりです。

Ls -al badfile anotherfile 2> / dev / null
たとえば、ファイルを削除せずにクリーンアップする必要がある場合は、同じアプローチが使用されます。

Cat / dev / null> myfile

結果

今日は、コマンドラインスクリプトで入力と出力がどのように機能するかについて学びました。 これで、ファイル記述子の処理方法、ファイル記述子の作成、表示、およびクローズの方法、入力、出力、およびエラーストリームのリダイレクトについての知識が得られました。 これらはすべて、bashスクリプトを開発するビジネスにおいて非常に重要です。

次回は、Linuxシグナル、スクリプトでそれらを処理する方法、スケジュールされたジョブを実行する方法、およびバックグラウンドタスクについて説明します。

親愛なる読者! この記事では、入力、出力、およびエラーストリームの操作の基本について説明します。 私たちはあなたの中に、経験によってのみもたらされるこれらすべてについて話すことができる専門家がいると確信しています。 もしそうなら、私たちはあなたに床を与えます。

多くの場合、ターミナルで作業するときは、コマンド(または任意のコンソールアプリケーション)の作業結果をテキストファイル、またはより単純にログに保存する必要があります。 Linuxにはこのアイデアを実装する方法がたくさんありますが、この記事ではそれらのいくつかを見ていきます。

標準出力ストリーム( StdOut)-これは、エラーを除いて、コマンド実行の結果として表示されるすべての情報です。
標準エラー出力ストリーム( StdErr)-これは、エラーがある場合はそれに関する情報です。


コマンド> logfile.txt

標準出力ストリーム(StdOut)はファイルにリダイレクトされ、ターミナルには表示されません。 ファイルがすでに存在する場合は、 上書き.

コマンド>> logfile.txt

標準出力ストリーム(StdOut)はファイルにリダイレクトされ、ターミナルには表示されません。 ファイルがすでに存在する場合、新しいデータは次のようになります。 ファイルの最後に追加.

コマンド2> logfile.txt

標準エラー出力ストリーム(StdErr)はファイルにリダイレクトされ、ターミナルに表示されません。 ファイルがすでに存在する場合は、 上書き.

コマンド2 >> logfile.txt

標準エラー出力ストリーム(StdErr)はファイルにリダイレクトされ、ターミナルに表示されません。 ファイルがすでに存在する場合、新しいデータは次のようになります。 ファイルの最後に追加.

&> Logfile.txtコマンド

標準出力ストリーム(StdOut)とエラーの標準出力ストリーム(StdErr)はファイルにリダイレクトされ、端末には表示されません。 ファイルがすでに存在する場合は、 上書き.

&>> logfile.txtコマンド

標準出力ストリーム(StdOut)とエラーの標準出力ストリーム(StdErr)はファイルにリダイレクトされ、端末には表示されません。 ファイルがすでに存在する場合、新しいデータは次のようになります。 ファイルの最後に追加.

チーム| tee logfile.txt

標準のデータ出力ストリーム(StdOut)はファイルにリダイレクトされ、同時に端末に表示されます。 ファイルがすでに存在する場合は、 上書き.

チーム| tee -a logfile.txt

標準のデータ出力ストリーム(StdOut)はファイルにリダイレクトされ、同時に端末に表示されます。 ファイルがすでに存在する場合、新しいデータは次のようになります。 ファイルの最後に追加.

の例

uname -r> logfile.txt

出力は、現在のディレクトリのlogfile.txtに保存されます。 画面には何も表示されません。

Uname -r | tee logfile.txt

出力は、現在のディレクトリのlogfile.txtに保存されます。 また、結果が画面に表示されます。



I / Oデバイスを再割り当てすることにより、あるプログラムはその出力を別のプログラムの入力に向けたり、それを入力として使用して別のプログラムの出力をインターセプトしたりできます。 したがって、最小限のプログラムオーバーヘッドでプロセス間で情報を転送することが可能です。 実際には、これは、標準の入出力デバイスを使用するプログラムの場合、オペレーティングシステムで次のことができることを意味します。

  • プログラムメッセージを画面(標準出力ストリーム)ではなく、ファイルまたはプリンター(出力リダイレクト)に出力します。
  • キーボード(標準の入力ストリーム)からではなく、準備されたファイル(入力リダイレクト)から入力データを読み取ります。
  • あるプログラムから別のプログラムへの入力としてメッセージを渡します(パイプラインまたはコマンド構成)。

コマンドラインから、これらの機能は次のように実装されます。 コマンドによって表示されたテキストメッセージをコマンドラインからテキストファイルにリダイレクトするには、構造を使用する必要があります コマンド>ファイル名。出力用に指定されたファイルがすでに存在する場合は上書きされ(古いコンテンツは失われます)、存在しない場合は作成されます。 ファイルを再作成せずに、コマンドで出力された情報を既存のファイルの最後に追加することもできます。 これを行うには、出力リダイレクトコマンドを次のように指定する必要があります。 コマンド>>ファイル名..。 記号を使用する< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

コマンドライン入力/出力リダイレクトの例

I / Oリダイレクトの例を次に示します。

1.結果の結論 pingコマンドファイルへ ping ya.ru> ping.txt

2.のヘルプテキストを追加する copy.txtファイルへのXCOPYコマンド:XCOPY /? >> copy.txt

必要に応じて、コマンド2> filenameを使用して、エラーメッセージ(標準エラーストリーム)をテキストファイルにリダイレクトできます。この場合、標準出力が画面に出力されます。 情報メッセージとエラーメッセージを同じファイルに出力することもできます。 これは次のように行われます。 コマンド>ファイル名2>&1

たとえば、次のコマンドは、標準出力と標準エラーをcopy.txtにリダイレクトします。 XCOPY A:\ 1.txt C:> copy.txt 2>&1

Linuxに組み込まれているリダイレクト機能は、あらゆる種類のタスクに使用されるさまざまな簡略化ツールを提供します。 さまざまなI / Oストリームを管理する機能により、複雑なソフトウェアを開発する場合とコマンドラインを使用してファイルを管理する場合の両方で、生産性が大幅に向上します。

I / Oストリーム

Linux環境での入力と出力は、次の3つのスレッドに分割されます。

  • 標準入力(標準入力、stdin、ストリーム番号0)
  • 標準出力(stdout、番号1)
  • 標準エラー、または診断ストリーム(標準エラー、stderr、番号2)

ユーザーが端末を操作すると、標準の入力がユーザーのキーボードを介して渡されます。 標準出力と標準エラーがテキストとしてユーザー端末に表示されます。 これら3つのストリームはすべて、標準ストリームと呼ばれます。

標準入力

標準の入力ストリームは通常、ユーザーからプログラムにデータを転送します。 標準入力を想定するプログラムは、通常、デバイス(キーボードなど)から入力を受け取ります。 標準入力は、EOF(ファイルの終わり)に達すると停止します。 EOFは、読み取るデータがこれ以上ないことを示します。

標準入力がどのように機能するかを確認するには、catを実行します。 このツールの名前は、「連結」(何かを接続または結合するため)を意味します。 通常、このツールは2つのファイルの内容を組み合わせるために使用されます。 引数なしで実行すると、catはコマンドラインを開き、標準入力の内容を受け入れます。

次に、いくつかの数字を入力します。

1
2
3
ctrl-d

数字を入力してEnterキーを押すと、実行中のcatプログラムに標準入力が送信され、そのデータが受け入れられます。 次に、catプログラムは、受信した入力を標準出力に表示します。

ユーザーはctrl-dを押すことでEOFを設定できます。その後、catプログラムは停止します。

標準出力

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

echo標準出力を介して端末に送信されます

追加オプションなしのechoコマンドは、コマンドラインで渡されたすべての引数を画面に表示します。

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

このコマンドは空の文字列を返します。

標準エラー

この標準ストリームは、クラッシュしたプログラムによって生成されたエラーを記録します。 標準出力と同様に、このストリームはデータを端末に送信します。

lsコマンドのエラーストリームの例を見てみましょう。 lsコマンドは、ディレクトリの内容を表示します。

引数がない場合、このコマンドは現在のディレクトリの内容を返します。 lsの引数としてディレクトリ名を指定すると、コマンドはその内容を返します。

%ディレクトリが存在しないため、コマンドは標準エラーを返します。

ls:アクセスできません%:そのようなファイルまたはディレクトリはありません

ストリームリダイレクト

Linuxには、各ストリームをリダイレクトするための特別なコマンドが用意されています。 これらのコマンドは、標準出力をファイルに書き込みます。 出力が存在しないファイルにリダイレクトされる場合、コマンドはその名前で新しいファイルを作成し、リダイレクトされた出力をそのファイルに保存します。

1つの山かっこを含むコマンドは、ターゲットファイルの既存のコンテンツを上書きします。

  • >-標準出力
  • < — стандартный ввод
  • 2>-標準エラー

二重山括弧を使用したコマンドは、ターゲットファイルの内容を上書きしません。

  • >>-標準出力
  • << — стандартный ввод
  • 2 >>-標準エラー

次の例を考えてみましょう。

cat> write_to_me.txt
NS
NS
NS
ctrl-d

この例では、catコマンドを使用して出力をファイルに書き込みます。

write_to_me.txtの内容を確認します。

cat write_to_me.txt

コマンドは次を返す必要があります。

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

cat> write_to_me.txt
1
2
3
ctrl-d

次に、ファイルの内容を確認します。

cat write_to_me.txt

コマンドは次を返す必要があります。

ご覧のとおり、出力をリダイレクトするコマンドは単一の山括弧を使用しているため、ファイルには最新の出力のみが含まれています。

次に、2つの山かっこを使用して同じコマンドを実行してみます。

猫>> write_to_me.txt
NS
NS
NS
ctrl-d

write_to_me.txtを開きます:

1
2
3
NS
NS
NS

二重山括弧を使用したコマンドは、既存のコンテンツを上書きしませんが、それを補強します。

コンベヤー

パイプは、あるコマンドの出力を別のコマンドの入力にリダイレクトします。 この場合、2番目のプログラムに転送されたデータは端末に表示されません。 データは、2番目のプログラムで処理された後にのみ画面に表示されます。

Linuxのパイプラインは、縦棒で表されます。

例えば:

これにより、ls(現在のディレクトリの内容)の出力がlessにパイプされ、そこに渡されたデータが1行ずつ表示されます。 原則として、lsは行に分割せずにディレクトリの内容を1行に出力します。 lsの出力をlessにリダイレクトすると、最後のコマンドで出力が行に分割されます。

ご覧のとおり、パイプラインは、データをファイルにリダイレクトするだけの>や>>とは異なり、あるコマンドの出力を別のコマンドの入力にリダイレクトできます。

フィルタ

フィルタは、パイプラインのリダイレクトと出力を変更できるコマンドです。

ノート:フィルターは、パイプラインなしで使用できる標準のLinuxコマンドでもあります。

  • find-名前でファイルを検索します。
  • grep-指定されたパターンに基づいてテキストを検索します。
  • tee-標準入力を標準出力と1つ以上のファイルにリダイレクトします。
  • tr-文字列を検索して置換します。
  • wc-文字、行、単語をカウントします。

I / Oリダイレクトの例

リダイレクトの基本的な概念とメカニズムに慣れてきたので、それらの基本的な使用例をいくつか見てみましょう。

コマンド>ファイル

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

ls〜> root_dir_contents.txt

このコマンドは、システムルートディレクトリの内容を標準出力として転送し、出力をroot_dir_contentsファイルに書き込みます。 コマンドは単一の山かっこを使用するため、これによりファイル内の以前のすべてのコンテンツが削除されます。

コマンド> / dev / null

/ dev / nullは、コンソールへの不要な出力を回避するために、標準出力を抑制したり診断したりするために使用される特別なファイル(「空のデバイス」と呼ばれる)です。 / dev / nullに該当するデータはすべて破棄されます。 / dev / nullへのリダイレクトは、シェルスクリプトで一般的に使用されます。

ls> / dev / null

このようなコマンドは、lsコマンドによって返される標準出力をフラッシュし、それを/ dev / nullに渡します。

コマンド2>ファイル

このテンプレートは、コマンドの標準エラーをファイルにリダイレクトし、現在のコンテンツを上書きします。

mkdir "" 2> mkdir_log.txt

このコマンドは、無効なディレクトリ名が原因で発生したエラーをリダイレクトし、log.txtに書き込みます。 エラーは引き続き端末に表示されますのでご注意ください。

コマンド>>ファイル

このパターンは、ファイルの現在の内容を上書きすることなく、コマンドの標準出力をファイルにリダイレクトします。

echo新しいファイルに書き込まれます> data.txt
echo既存のファイルの内容に追加>> data.txt

このコマンドのペアは、最初にユーザー入力を新しいファイルにリダイレクトし、次にその内容を上書きせずに既存のファイルに挿入します。

コマンド2 >>ファイル

このテンプレートは、既存のファイルの内容を上書きせずに、コマンドの標準エラーをファイルにリダイレクトします。 ログの内容は常に更新されないため、プログラムやサービスのエラーログの作成に適しています。

"" 2> stderr_log.txtを検索します
wc "" 2 >> stderr_log.txt

上記のコマンドは、無効なfind引数が原因のエラーメッセージをstderr_log.txtファイルにリダイレクトしてから、無効なwc引数が原因のエラーメッセージをファイルに追加します。

チーム| 指図

このパターンは、最初のコマンドの標準出力を2番目のコマンドの標準入力にリダイレクトします。

検索/ var lib | grep deb

このコマンドは、/ varディレクトリとそのサブディレクトリでファイル名とdeb拡張子を検索し、ファイルへのパスを返し、検索パターンを赤で強調表示します。

チーム| teeファイル

このようなパターンは、コマンドの標準出力をファイルにリダイレクトし、その内容を上書きしてから、リダイレクトされた出力をターミナルに表示します。 指定されたファイルが存在しない場合は、新しいファイルが作成されます。

このテンプレートでは、通常、teeコマンドを使用して、プログラムの出力を表示し、同時にファイルに保存します。

wc / etc /マジック| tee magic_count.txt

このようなコマンドは、マジックファイル(Linuxはこれを使用してファイルタイプを決定します)の文字数、行数、および単語数をteeコマンドに渡します。teeコマンドは、このデータを端末とmagic_count.txtファイルに送信します。

チーム| チーム| コマンド>>ファイル

このパターンは、最初のコマンドの標準出力をリダイレクトし、次の2つのコマンドでフィルタリングしてから、最終出力をファイルに追加します。

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

このようなコマンドは、ルートディレクトリのls出力をgrepコマンドに送信します。 次に、grepは受信したデータでtarファイルを探します。 その後、grepの結果がtrコマンドに渡され、すべてのe文字がEに置き換えられます。結果の結果はls_log.txtファイルに追加されます(そのようなファイルが存在しない場合、コマンドは自動的に作成します) )。

結論

Linux I / Oリダイレクト機能は、最初は複雑すぎるように見えます。 ただし、リダイレクトの操作は、最も重要なシステム管理者のスキルの1つです。

コマンドの詳細については、次を使用してください。

manコマンド| 以下

例えば:

このようなコマンドは、teeのコマンドの完全なリストを返します。

タグ:
トピックの続き:
OS

最新のスマートフォンの所有者は、充電せずに電子機器の動作時間を満足していないため、多くの人がその動作を最適化することを考えています。 いいえ...