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"입니다.
그래서 우리는 그 둘을 합친다.
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