exec>>理解する(コマンド)

exec>>理解する(コマンド)

exec > >(tee logfile)次のコードの効果を理解しようとしています。

#!/bin/bash                                                                                                                 

exec 7>&1           # save stdout for later reset                                                                           

exec > >(tee logfile)          # point stdout to FIFO pointing to tee command?                                              
#+expect any subsequent output to stdout to be sent                                                                         
#+both to stdout and logfile.                                                                                               

# so let's send some output                                                                                                 
echo
echo howdy             # expect these strings to be sent both to terminal and                                               
echo g\'day            #+logfile                                                                                            
echo hello!

# restore stdout                                                                                                            
exec 1>&7
exec 7>&-

#check content of logfile!                                                                                                  
echo ------------
cat logfile

私はexec > >(tee logfile)stdoutが>(tee logfile)

以下は、このスクリプトを実行したときの端末の出力です。

--------------------

howdy
g'day
hello!

howdy
g'day
hello!

ログファイルの内容は次のとおりです。


howdy
g'day
hello!

stdoutを端末にリダイレクトしようとすると効果がないようですexec 1>&7。おそらく、exec 1>&7ログファイルが作成され、その内容が端末に送信された後に発生する可能性があります。

そして、スクリプトを実行すると、端末の出力がわかりません。読むexec > >(tee logfile)前にブロックされると思います。cat logfileその後、ログファイルの内容はtee logfile

これを理解するのに役立ちますか?

ありがとうございます。

答え1

このコマンドの一般的な形式は、exec > outputstdoutへのすべての追加出力が "output"ファイルに転送されるようにすることです。

これは拡張できます。たとえば、exec 2> errorstderrのすべての追加出力が「error」ファイルに送信されます。

これで>(...)、出力を次に書き込むことを意味するbashismです。注文する; この場合、コマンドは「tee logfile」です。

だから我々はそれらの2つを組み合わせる。

exec > >(tee logfile)「すべての追加出力をコマンドに書き込むtee logfile」を意味します。

これは、将来のすべての出力が画面に送信されることを意味します。そして(経由tee) "logfile"ファイルとして

答え2

今わかります。

$ exec 7>&1
$ exec > >(tee logfile)
$ ls -l /proc/self/fd
fd/     fdinfo/ 
logan@logan-mainPC:~/my-test/learning-process-substitution$ ls -l /proc/self/fd
total 0
lrwx------ 1 logan logan 64 Feb 14 15:40 0 -> /dev/pts/0
l-wx------ 1 logan logan 64 Feb 14 15:40 1 -> pipe:[9603908]
lrwx------ 1 logan logan 64 Feb 14 15:40 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:40 3 -> /proc/398229/fd
lrwx------ 1 logan logan 64 Feb 14 15:40 7 -> /dev/pts/0
$ echo hi i will restore stdout now
hi i will restore stdout now
$ exec 1>&7
$ exec 7>&-
$ ls -l /proc/self/fd
total 0
lrwx------ 1 logan logan 64 Feb 14 15:41 0 -> /dev/pts/0
lrwx------ 1 logan logan 64 Feb 14 15:41 1 -> /dev/pts/0
lrwx------ 1 logan logan 64 Feb 14 15:41 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:41 3 -> /proc/398237/fd
$ cat logfile 
total 0
lrwx------ 1 logan logan 64 Feb 14 15:40 0 -> /dev/pts/0
l-wx------ 1 logan logan 64 Feb 14 15:40 1 -> pipe:[9603908]
lrwx------ 1 logan logan 64 Feb 14 15:40 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:40 3 -> /proc/398229/fd
lrwx------ 1 logan logan 64 Feb 14 15:40 7 -> /dev/pts/0
hi i will restore stdout now

関連情報