sh a.sh <&0 >&0
- どういう意味ですか?特に、それがどういう意味なのかよく分からないんです&0
。
答え1
n>&p
ファイル記述子(fd)をファイル記述子にn<&p
コピーするために使用されるのと同じ演算子。つまり、ファイル記述子をfdがリダイレクトするリソースにリダイレクトします。p
n
n
p
リダイレクトされたファイル記述子が使用される方向(読み取りまたは書き込み)を決定するために使用されませ<
ん。と同じ方向になります。つまり、書き込み用に開いている場合は、この演算子を使用しても同様です。>
n
p
p
n
n<&p
2つの演算子の唯一の違いは、n
指定されていない場合です。>&p
stdoutをリダイレクトし(またはに似ています)、stdinをリダイレクトします(またはに似てい1>&p
ます1<&p
)。<&p
0<&p
0>&p
<&0
同様に、0<&0
stdinをリダイレクトされるリソースにstdinをリダイレクトするので、役に立つものはなく、通常は機能しません。
しかし、すべてのシェルで常に機能しているわけではありません。ジョブ制御が無効になると、POSIXはバックグラウンドコマンドのstdinをそのファイル/dev/null
または同等のファイルにリダイレクトする必要があります。<&0
これはBashで上書きされます(4.4.12でテスト済み)。比較(ls -l /proc/self/fd/0 &)
して(<&0 ls -l /proc/self/fd/0 &)
。これは状況によっては便利です。
>&0
fd 0 を fd 1 にコピーします。 fd 1(stdout)は慣例的に書き込みにのみ使用されるため、>&0
fd 0が読み取り+書き込みモードで開く場合にのみ意味があります。
これは fd 0 が端末装置を指すときに発生します。ターミナルエミュレータはgetty
通常、ターミナルデバイスを読み書きモードで開き、fd 0、1、2をここに割り当てるためです。
したがって、この記事を書いた人は、stdinがターミナルを指していると仮定し、stdoutをターミナルにリダイレクトしたかったでしょう。
意味のある場所の1つn>&n
はzshとそのmult_IOs
機能です。存在するzsh
:
some-cmd >&1 > some-file
# that is: some-cmd 1>&1 1> some-file
次のように、標準出力をsome-cmd
(&1)以前のすべてのstdoutにリダイレクトします。some-file
some-cmd | tee some-file
しかし、
some-cmd <&0 < some-file
# that is: some-cmd 0<&0 0< some-file
次のように生の標準入力を最初に入力し、次に入力some-file
として提供します。some-cmd
cat - some-file | some-cmd
ただし、cmd <&0 >&0
fd 0では一度だけリダイレクトされるため、適用されません。
n>&n
ksh
また、一部のシェル(、、zsh
not、dash
または)では、ファイル記述子が開いていないとエラーが発生し、コマンドの実行を中断する可能性があるため、bash
興味深い副作用があります。だからその殻の中にyash
n
cmd 0<&0
cmd
終了病理学的条件下での実行を防ぎますstdin
。
$ ksh -c 'cat file - <&0' <&-
ksh: 0: cannot open [Bad file descriptor]
$ mksh -c 'cat file - <&0' <&-
mksh: <&0 : bad file descriptor
$ zsh -c 'cat file - <&0' <&-
zsh:1: 0: bad file descriptor
$ bash -c 'cat file - <&0' <&-
contents of file
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
答え2
この場合、&の後に数字が付くとファイル番号が表示されます。ファイル番号0は標準入力(stdin
)です。<
および文字は、>
それぞれプロセスの標準入力と標準出力のリダイレクトを表します。
したがって、簡単に言うと、このコマンドは実行a.sh
(sh
シェルスクリプトとして)して、スクリプトの標準入力と出力(実際にはサブシェル)を標準入力にリダイレクトすることを意味します。
この場合、<&0
重複します(デフォルト動作)。 >&0
これは、親シェルに基づいて標準出力に印刷される内容を標準入力として印刷することを意味します。ほとんどのttyはこれらの出力を表示するので、リダイレクトはほとんど効果がなく、顕著な効果がない可能性があります。
考えられるシナリオの1つは、親シェルの標準出力ファイルが奇妙に閉じられていることです。これは奇妙なケースです。