Linuxでファイルを参照できる**出力**には4つのタイプがあります。これは本当ですか?

Linuxでファイルを参照できる**出力**には4つのタイプがあります。これは本当ですか?

導き出すことができる結論には4つのタイプがありますか?ストリーム出力コマンドの実行後にCLIにファイルが表示されたくない場合は、Linuxでファイルを参照できますか?

ファイルへの考えられる参照:

  1. すべてのストリーム出力
  2. 標準エラーのみ
  3. 標準出力のみ(標準出力の最終結果を含む)。
  4. stdoutとstderr(stdoutの最終結果を除く)

メモ:

数字4の例は次のとおりですfind / -type f -name php.ini 2>/dev/null。私が知っている限り、このコマンドを使用すると標準エラーや標準出力は発生しません(例外標準出力の最終結果この場合、これは私たちが検索するファイルです(見つかった場合)。

答え1

Unixシステムのすべてのプロセスには2つの出力ストリームが接続されています。標準出力(stdout、ファイル記述子1)と標準エラー(stderr、ファイル記述子2)。これらは互いに独立してリダイレクトできます。標準入力ファイル記述子0を使用します。

  • 標準出力をファイルにリダイレクトするには、またはより明示file的な 。廃棄されたデータに置き換えられました。>file1>filefile/dev/null
  • 標準エラーをファイルにリダイレクトするにはfile2>file
  • 標準エラーを標準出力のある場所にリダイレクトするには2>&1
  • 標準出力を標準エラー位置にリダイレクトするには1>&2

プロセスの流れや「最終結果」という概念はありません。標準出力に送信されたすべての項目がプロセスの「結果」と見なされることを願っています。ただし、それ自体が開いたか、他の副作用(ディレクトリからファイルへのリンクを解除するなど)がある一部のファイルにデータを出力しない限り、プロセスの「結果」と見なされます。 )rmまたは場合によっては複数のネットワーク接続を処理しますsshd。さらに、プロセスはプロセスの「結果」と見なすことができる終了状態(「成功」の場合は0、「失敗」の場合は0ではない)を返しますが、これは必ずしもプロセスの出力ストリームに関連しているわけではありません。

ストリームは次にリダイレクトすることもできます。追加モードつまり、ファイルにリダイレクトすると、最初はファイルが切り捨てられず、ストリーム内のすべてのデータがファイルの末尾に追加されます。>>file代わりにを使用してこれを行います>file

質問の意見では、命令は

find / -type f -name php.ini 2>/dev/null

与えられた。リダイレクト(廃棄)ただ標準エラー。標準出力ストリームはまったくリダイレ​​クトされないため、コンソールまたは端末に完全に表示されます。パイプの中央にある場合、標準出力ストリームはパイプ内の次のコマンドの標準入力に供給されます。

おおむね次のようになります。二つ(4つではありません)出力ストリーム。コンテンツの削除など、さまざまな方法で独立してリダイレクトできます。

答え2

すべてプロセス通常、3 つの標準ファイル記述子を使用できます。これらのファイル記述子はストリームとして利用可能です:stdin、、stdoutおよびstderr

デフォルトでは、シェル(CLI)でプロセスを開始すると、最初のプロセスは端末(またはxtermなどの端末エミュレータ)の入力に接続され、残りの2つのプロセスは端末の出力に接続されます。

/dev/nullたとえば、嚥下などの他の場所にリダイレクトするようにシェルに指示できます。stdoutこの操作は と に対して独立して実行できますstderr。したがって、この状況には実際には4つの可能性があります。

command 
command > /dev/null
command 2> /dev/null
command > /dev/null 2> /dev/null

ただし、どちらか一方または両方を別の場所にリダイレクトするのを防ぐことはできません。

command > /tmp/myout 2> /tmp/myerr

この場合、端末には何の出力も得られませんが、/tmp/myout後でファイルと/tmp/myerr

答え3

状況は、あなたの質問に見られるよりもシンプルで複雑です。何か説明してください。先行は達成するのが難しいで言った彼の答え、規則に従って構成され、出力に使用される2つの標準(一般)I / Oストリーム(ファイル記述子)があります:stdout(ファイル記述子1)とstderr(ファイル記述子2)。私たちの規範的な問題、 シェルの制御およびリダイレクト演算子は何ですか?では、リダイレクトする方法について説明します。無邪気に5つの組み合わせを列挙することができます。

╔══════════════════════════════╦═════════════════════════════════════════════╗
║                              ║                   stderr                    ║
║                              ╟─────────────────────┬───────────────────────╢
║                              ║       default       │                       ║
║                              ║ (same as the shell) │       redirected      ║
╠════════╤═════════════════════╬═════════════════════╦═══════════════════════╣
║        │       default       ║                     ║                       ║
║        │ (same as the shell) ║          1          ║           2           ║
║        ├─────────────────────╠═════════════════════╬═══════════════════════╣
║ stdout │                     ║                     ║ 4. redirected         ║
║        │                     ║                     ║    to the same file   ║
║        │      redirected     ║          3          ╟───────────────────────╢
║        │                     ║                     ║ 5. redirected         ║
║        │                     ║                     ║    to different files ║
╚════════╧═════════════════════╩═════════════════════╩═══════════════════════╝

ただし、/dev/null追加モードをファイルと区別し、追加モードを書き込み専用モードと区別し、パイプをファイルと区別すると、組み合わせの数が指数関数的に増加します。しかし、繰り返し指摘したように、「stdoutの最終結果」は標準のUnix / Linux / bashのフレーズではありません。

たった二つ?

他の答えは(おそらく賢明に)stdoutとstderr(ファイル記述子1と2)に制限されています。私は(無謀にも)この質問に対する完全な答えは、他のファイル記述子が最大数百、数千、さらには利用可能であるという事実に対処しなければならないと信じています。百万以上。たとえば、同様のコマンドを実行するとプログラムが開き、diff file1 file2カーネルdiffはファイル記述子3と4を割り当てることができます。違いは、ファイル記述子0、1、2のみが事前定義されていることです。 2 より大きいファイル記述子をリダイレクトする方法は、次の場所で説明します。file1file2

たとえば、次の高いファイル記述子の例をご覧ください。

$catdog.c
#include <stdio.h>
#include <string.h>

基本()
{
        int i、len;
        char msg[] = "こんにちは、犬。\n";

        len = strlen(msg);
        i =書き込み(17、メッセージ、長さ);
        if(i == len)
                printf("成功! i = %d = len\n", i);
        そうでない場合(i == -1)
            {
                printf("エラー! i = %d (len = %d)\n", i, len);
                間違い("");
            }
        その他
                printf("予期しない結果: i = %d, len = %d\n", i, len);
}

$犬を作る
cc個.c -o個

$ ./犬
間違い!私は= -1(len = 12)
無効なファイル記述子

$./canine 17 > 動物
成功! I = 12 = 長さ

$ls -l
合計70個
-rw-r--r-- 1マイユーザー名マイグループ名    2012年4月12日 13:36 動物
-rwxr-xr-x 1マイユーザー名マイグループ名67067 4月12日13時36分
-rw-r--r-- 1マイユーザー名マイグループ名   358 4月12日 13:36 dog.c

$猫動物
こんにちは、犬。

警告:上記の内容がすべてのシェルのすべてのバージョンに適用されるかどうかはわかりません。

標準プログラムは2以上のファイル記述子に書き込みません(ファイルを開く、ネットワーク接続設定、または同様の操作でカーネルからファイル記述子を取得しない限り)。ただし、これを実行する(非標準)プログラムがある場合は、これらのファイル記述子をリダイレクトできます。

そして、ファイルディスクリプタが100個だけで、各ファイルディスクリプタがリダイレクトされるかどうかを考慮するだけで、10億以上の可能な組み合わせがあります。

関連情報