파이프와 출력 리디렉션이 모두 포함된 명령의 실행 순서는 무엇입니까?
다음을 수행한다고 가정해 보겠습니다.
Charles@myzone:/tmp$ mkdir /tmp/testdir
Charles@myzone:/tmp$ cd /tmp/testdir
Charles@myzone:/tmp/testdir$ touch file1 file2
Charles@myzone:/tmp/testdir$ ls | wc -l
2
Charles@myzone:/tmp/testdir$ ls | wc -l > ls_result
Charles@myzone:/tmp/testdir$ cat ls_result
3
이렇게 하면 쉘이 다음과 같은 작업을 수행하므로 자체 이름이 포함된다는 것을 ls > result
알고 있습니다.result
1) 이름이 지정된 파일 생성/열기 result
2) fd를 result
stdout으로 설정 3) execls
처음에는 값이 ls_result
2일 것으로 예상했는데 결과적으로 3이 나왔습니다.
질문
위 명령은 어떻게 ls | wc -w > ls_result
실행되나요?
동등한가 (ls | wc -w ) > ls_result
?
관련 정보에 대한 링크가 있습니까? (Bash 매뉴얼을 확인했습니다)
답변1
utility1 | utility2 >output
같지 않음
( utility1 | utility2 ) >output
이 아니라면
utility1 | { utility2 >output; }
두 유틸리티는 거의 동시에 시작됩니다. 즉, 명령이 때로는 3을 반환하고 때로는 2를 반환하기를 원한다는 의미입니다.
예:
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
위의 파이프 오른쪽에 생성된 파일은 다음과 같습니다.때때로파이프의 왼쪽에서 감지됩니다.
답변2
남자 난교
REDIRECTION
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell. Redirection
may also be used to open and close files for the current shell execution environment. The following redirection operators may precede
or appear anywhere within a simple command or may follow a command. Redirections are processed in the order they appear, from left to
right.
따라서 명령을 실행하면 ls_result가 생성되고 ls 명령이 실행됩니다. 그렇기 때문에 출력은 3입니다.
LS | 화장실 -l > ls_results