私は長年この概念を理解しようとしてきましたが、現在の理解は不完全です。
ここで誰もが一種のチュートリアルや例を通して良い説明をすることができますか?
- 新しく開く
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/socket
もzsh/net/tcp
あります。zsh/zpty
exec
シェルプロセスのファイル記述子を変更するために使用されます。ただし、ほとんどの場合、open on fd 1(stdout)ls -l dir/ > file
(略語)やコードスニペットなどの他のコマンドのファイル記述子を変更したいと思います。ls -l dir/ 1> file
file
ls
{
echo Some Header
ls -l dir/
} 1> file 2>> error.log
foo | bar
pipe()
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を除外します。パイプを使用する他の構造の場合も同様です。