Bash IOリダイレクト、「fd」を開くと閉じる、誰かを説明できますか?

Bash IOリダイレクト、「fd」を開くと閉じる、誰かを説明できますか?

私は長年この概念を理解しようとしてきましたが、現在の理解は不完全です。

ここで誰もが一種のチュートリアルや例を通して良い説明をすることができますか?

  • 新しく開くfd
  • 次から読むfd
  • 使用fd
  • 閉鎖fd

私が読んでhttps://www.gnu.org/software/bash/manual/html_node/Redirections.htmlしかし、man bash不明確で具体的で理解可能な例はまったくありません。

誰かがよく説明してくれれば私だけでなく貴重な答えになるだろう。構文はほとんどの場合少し混乱しています。
必要な場合もあり、execそうでない場合もあります。

答え1

Bourneに類似

システムコール シェルインターフェース シェル コメント
open("file", O_RDONLY) exec 3< file みんな ここでfd 3で開く
open("file", O_RDONLY) exec {fd}< file zsh ksh93 バッシュ fd は$fd² 内で返されます。
open("file", O_WRONLY|O_TRUNC|O_CREAT) exec 3> file みんな 立方体
open("file", O_WRONLY|O_APPEND|O_CREAT) exec 3>> file みんな 4
open("file", O_RDWR|O_CREAT) exec 3<> file みんな
open("file", ...) sysopen ... 扱いにくい zsh/systemモジュールから
dup2(4, 5) exec 5>&4 みんな それは同じですexec 5<&4
dup(4) exec {fd}>&4 zsh ksh93 バッシュ fdを返す$fd
write(4, data, length) print -rnu4 -- "$data" クシュシュ Bashprintにはロード可能な組み込み例5もあります。
write(...) syswrite ... 扱いにくい zsh/systemモジュールから
read(4, var...) sysread -i 4 ... var 扱いにくい zsh/systemモジュール内
read(4, var...) IFS= read -ru4 ... var ksh zsh バッシュ 一行をお読みください。制限事項に注意してください。5
close(4) exec 4>&- みんな またはexec 4<&-
lseek(4, 123, SEEK_SET) exec 4>#((123)) クッシュ 93
lseek(4, 123, SEEK_CUR) exec 4>#((CUR + 123)) クッシュ 93
lseek(4, 123, SEEK_END) exec 4>#((EOF + 123)) クッシュ 93
lseek(...) sysseek ... 扱いにくい zsh/system-module6から
pipe() exec 4>>|5 ヤッシュ fd 4書き込み終了、5読み取り終了
fstat(4, var) zstat -f 4 -H var 扱いにくい zsh/statモジュールから
select(...) zselect ... 扱いにくい zsh/zselect モジュールから

zshには、他の種類のfdを作成して動作するいくつかのモジュールzsh/net/socketzsh/net/tcpあります。zsh/zpty

execシェルプロセスのファイル記述子を変更するために使用されます。ただし、ほとんどの場合、open on fd 1(stdout)ls -l dir/ > file(略語)やコードスニペットなどの他のコマンドのファイル記述子を変更したいと思います。ls -l dir/ 1> filefilels

{
  echo Some Header
  ls -l dir/
} 1> file 2>> error.log

foo | barpipe()7 を実行してからdup2()s またはそれに対応する項目と同時プロセスの s を実行するclose()と、実行中のプロセスの fd 1 がfooパイプの書き込み側に移動し、fd 0 またはbar読み取り側に移動します。パイプを使用または使用できる他のシェル構成には、コマンド置換(var=$(cmd)、、var=`cmd`)、Kornに似たシェルプロセス置換(foo <(bar) >(baz))、コプロセス、およびyashのプロセスリダイレクトが含まれます。


¹ ksh93 と bash の場合は、file実際の/dev/tcp|udp/host/portオープンを行わずにネットワークソケットを作成します。

²他の、、、、演算>子 もこれを行うことができます。>><>>

³noclobberオプションがオンの場合、O_EXCLターゲットが通常のファイルの場合は追加します。これはシェルに応じ>|て or 演算子を使用して>!バイパスできます。

4Bourneシェルにはありませんが、O_APPENDシェルはopenの後、最後まで探索します。

5他のシェルではいつでもできます。これは fd 4 に記録されず、printf %s "$var" >&4しばらくするとdup2(4, 1)実際に同じ目標を達成する fd 1 に記録されます。についても同様ですIFS= read -r line <&4

6systell(fd)もう1つのインターフェース、fdの位置を返す数学関数も参照してください。lseek()

socketpair()7パイプの代わりにsを使用する一部のシステムでは、ksh93を除外します。パイプを使用する他の構造の場合も同様です。

関連情報