web-dev-qa-db-ja.com

このスクリプトは何をしていますか?

#!/bin/bash

echo 123456789 > out.txt
exec 3<> out.txt
read -n 4 <&3
echo -n 5 >&3
exec 3>&-

スクリプトの最後に、インタビューの筆記試験でout.txtの内容を尋ねられました。スクリプトの後書きを実行したところ、123456789が得られました。しかし、スクリプトで何が行われているのか、特にexecステートメントのある部分はわかりません。 execのマンページとGoogle検索結果を調べたところ、3<>ビットで何も見つかりませんでした。シェルスクリプトに精通している誰かが、ここで何が起こっているのか説明できますか?

3
syfluqs

_echo 123456789 > out.txt_は、文字列_123456789_を_out.txt_ファイルに書き込みます。

_exec 3<>out.txt_構文は、_out.txt_を読み取って_<_を書き込むためにファイル_>_を開き、ファイル記述子#3にアタッチします。

_read -n 4 <&3_は4文字を読み取ります。

_echo -n 5 >&3_は5を書き込みます(5を5に置き換える)。

_exec 3>&-_はファイル記述子#3を閉じます。

その結果

_cat out.txt
123456789
_

execintに関するセクション bash(1) は次のように述べています。

_exec [-cl] [-a name] [command [arguments]]_commandを指定すると、シェルが置き換えられます。 [...]commandが指定されていない場合、リダイレクトは現在のシェルで有効になります[...]。

8
Paulo Tomé