"cat > file_name << blah" 명령을 이해하는 방법은 무엇입니까?

"cat > file_name << blah" 명령을 이해하는 방법은 무엇입니까?

다음 명령에서 cat은 here-doc의 내용을 가져와 conf라는 파일로 리디렉션합니다.

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

여기서 명령의 순서를 이해하는 방법은 무엇입니까? 다른 모든 것 bash(여기서는 문서 섹션)이 먼저 처리된 다음 마지막 단계로 > conf섹션인 것처럼 보입니까?

답변1

여기 문서셸 리디렉션이므로 셸은 처음부터 끝까지(또는 왼쪽에서 오른쪽으로 또는 나타나는 순서대로) 일반적인 리디렉션처럼 실행합니다. POSIX는 다음과 같이 정의합니다.

명령이 여러 리디렉션 연산자를 지정하는 경우 평가 순서는 처음부터 끝까지입니다.


명령에서 쓰기용 파일 열기 및 자르기가 cat먼저 수행된 다음 .> confconfHere-Document

다음을 사용하여 strace확인할 수 있습니다 .

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

답변2

글쎄요, 알아봅시다:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

댕댕. 이 부분을 먼저 해야 할 것 같아요 >"$file". 하지만 만약...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...오류는 없나요...?

cat ./myfile

this is in ./myfile

순서가 중요한 것 같습니다.

답변3

bash를 실행하기 위해 프로세스가 생성 되면 쓰기를 위해 파일 설명자 1에서 해당 프로세스를 cat열고 프로그램을 실행하기 conf전에 읽기 위해 파일 설명자 0에서 임시 파일(이 문서에 사용됨)을 엽니다 . exec이 경우 이러한 작업이 수행되는 순서는 중요하지 않습니다.

예를 들어 2>&1.

관련 정보