リダイレクト。 「<>」、「<&」、「>&-」とは何ですか?

リダイレクト。 「<>」、「<&」、「>&-」とは何ですか?

<>- 数ヶ月前にどのウェブサイトでこの演算子を見ましたが、どういう意味なのか覚えていません。たぶん私が間違っているかもしれません、またはkshにいないかもしれません<>

a<&ba- この演算子が入力ストリームを出力ストリームとマージすることを知っていますb。私は正しいですか?しかし、どこで使うべきかわかりません。いくつかの例を挙げることができますか?

>&-– 私はそれについて何も知りません。例えば、それはどういう意味ですか2>&-

答え1

~からhttp://www.manpagez.com/man/1/ksh/:

   <>word        Open file word for reading and writing as  standard  out-
                 put.

   <&digit       The standard input is  duplicated  from  file  descriptor
                 digit  (see  dup(2)).   Similarly for the standard output
                 using >&digit.

   <&-           The standard input is closed.  Similarly for the standard
                 output using >&-.

と入力すると、これらの詳細をすべて確認できますman ksh

具体的には2>&-:標準エラーストリームを閉じます。つまり、コマンドは STDERR に書き込めなくなり、中断されます。基準これを行うには、書き込みが可能でなければなりません。


ファイル記述子の概念を理解するには、(Linuxシステムの場合)あなたは見ることができます/proc/*/fd (および/または/dev/fd/*:

$ ls -l /proc/self/fd
insgesamt 0
lrwx------ 1 michas users 1 18. Jan 16:52 0 -> /dev/pts/0
lrwx------ 1 michas users 1 18. Jan 16:52 1 -> /dev/pts/0
lrwx------ 1 michas users 1 18. Jan 16:52 2 -> /dev/pts/0
lr-x------ 1 michas users 1 18. Jan 16:52 3 -> /proc/2903/fd

ファイル記述子0(STDINとも呼ばれます)はデフォルトで読み取り、fd 1(STDOUTとも呼ばれます)はデフォルトで書き込み、fd 2(STDERRとも呼ばれます)はデフォルトでエラーメッセージを表します。 (この例では、ls実際にディレクトリを読み取るためにfd 3が使用されています。)

コンテンツをリダイレクトすると、次のように表示されることがあります。

$ ls -l /proc/self/fd 2>/dev/null </dev/zero 99<>/dev/random |cat
insgesamt 0
lr-x------ 1 michas users 1 18. Jan 16:57 0 -> /dev/zero
l-wx------ 1 michas users 1 18. Jan 16:57 1 -> pipe:[28468]
l-wx------ 1 michas users 1 18. Jan 16:57 2 -> /dev/null
lr-x------ 1 michas users 1 18. Jan 16:57 3 -> /proc/3000/fd
lrwx------ 1 michas users 1 18. Jan 16:57 99 -> /dev/random

デフォルトの記述子は、端末を指すことなく対応するリダイレクトを指します。 (ご覧のように、新しいfdを作成することもできます。)


別の例を挙げましょう<>

echo -e 'line 1\nline 2\nline 3' > foo # create a new file with three lines
( # with that file redirected to fd 5
  read <&5            # read the first line
  echo "xxxxxx">&5    # override the second line
  cat <&5             # output the remaining line
) 5<>foo  # this is the actual redirection

このようなことはできますが、そうする必要はほとんどありません。

関連情報