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 > output
stdoutへのすべての追加出力が "output"ファイルに転送されるようにすることです。
これは拡張できます。たとえば、exec 2> error
stderrのすべての追加出力が「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