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"입니다.

그래서 우리는 그 둘을 합친다.

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

관련 정보