[unix] “cat> file_name << blah”명령을 이해하는 방법은 무엇입니까?

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

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

여기서 명령 순서를 이해하는 방법은 무엇입니까? 합니까 bash첫번째 프로세스의 모든 것을 다른 사람 (여기-문서 일부) 및 최종 단계로는이 보이는 > conf부분을?



답변

Here-Document 는 일종의 쉘 리디렉션이므로 쉘은 처음부터 끝까지 (또는 왼쪽에서 오른쪽으로 또는 모양 순서대로) 일반적인 리디렉션으로 수행합니다. 이것은 POSIX에 의해 정의됩니다.

명령에 둘 이상의 리디렉션 연산자가 지정된 경우 평가 순서는 처음부터 끝까지입니다.


당신의 명령에서 cat수행 > conf첫째, 개방 및 잘라 내기 conf에서 데이터를 다음, 쓰기, 읽기 위해 파일을 Here-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
...


답변

자, 알아 봅시다 :

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

표시되는대로 주문이 중요합니다.


답변

bash실행에 대한 프로세스를 생성 cat, 그것은 열리는 conf파일 기술자 1에 쓰기 위해 그리고 전에, 파일 기술자 0에 읽기 (여기에-문서) 임시 파일을 여는 exec프로그램을 보내고. 이 경우 실제로 어떤 순서로 작업이 수행되는지는 중요하지 않습니다.

파일 디스크립터를 재 할당 할 때 순서가 중요해집니다 (예 🙂 2>&1.


답변