`<&-`は何をしますか?

`<&-`は何をしますか?

バックグラウンドでリモートでsshコマンドを実行するためにBashセクションをコピーしました。

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

<&-効果は何ですか?
私の推測では何か関連があるようです。< /dev/null

次の理解は、次のことを防ぐために3つの主要なファイル記述子(stdin、、、stdout)を閉じる必要があることです。stderr

  1. バックグラウンドで実行されているジョブとスクリプトの終了中に競合が発生しますか?
  2. 端末が閉じると、端末からstdinを受け取るすべてのプロセスが閉じますか?

答え1

<&-いいえかなり.fd < /dev/null0<&-を閉じます。< /dev/nullデバイスがリダイレクトしている間は/dev/nullデータを提供せず、読み取り時に常にEOFを提供します。主な違いは、read(2)閉じたFD(この<&-場合)の呼び出しはEBADFエラーを引き起こし、空のリダイレクトFDの呼び出しは読み取ったバイト(ファイルの終わり条件)を返さないことです。プログラムが標準入力からデータを読み取らない場合、違いは重要ではありません。

バックグラウンドで何かを実行するには、FDをオフにすることをお勧めします。なぜなら、バックグラウンドプロセスがTTYから何でも読み取ろうとすると中断されるからです。ただし、この例では必要なすべてを処理するわけではありませんが、理想的にはバックグラウンドプロセスを完全に分離するためにどこかにnohupOR呼び出しがあるはずです。setsid

答え2

バラよりman bash

  [n]<&word

入力ファイル記述子のコピーに使用されます。word1 つ以上の数字に展開すると、表示されるファイル記述子はnそのファイル記述子のコピーになります。数値が入力 word 用に開かれたファイル記述子を指定しないと、リダイレクトエラーが発生します。 wordがと評価されると、-ファイル記述子がn閉じます。指定しないと、n標準入力(ファイル記述子0)が使用されます。

答え3

<&-標準入力を閉じます。

これPOSIXで定義した一般形式、例:

[n]<&word

ファイル記述子が生成された目的は、nファイル記述子のコピーとして表示されますword。省略するとn標準入力とみなされ、そうであればwordファイル-記述子がn閉じられます。

</dev/nullこれは、</dev/null標準入力がまだ開いていて他の場所にリダイレクトされるという点で異なります。

SSHソケットに接続されているプロセスのすべてのファイル記述子を閉じる必要があります。それ以外の場合、SSH セッションを閉じることはできません。

以下を使用して、SSHセッションに接続しなくてもリモートシステムでコマンドを実行できます。画面またはマルチプレクサ:

ssh user@remote 'screen -S test -d -m command'

関連情報