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


13

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

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

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

답변:


17

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
...

내가 참조. 그래서 기본적으로 경우에 발생하는 cat > file_name << blah것으로는 실행하기 전에되어 표준 출력 라는 이름의 파일에 연결되어있는 쉘을 다음과 stdin을 쉘에 연결되어 여기-문서 ? catfile_name
Martin

@ 마틴 : 예. 당신은 open전에 호출되었다 볼 수 있습니다 dup2.
cuonglm

12

자, 알아 봅시다 :

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

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


-1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.