이 bash 명령의 여러 단계는 어떤 순서로 완료됩니까?
(flock -n 9) 9> toto.txt
서브쉘 부분만 수행하는 경우:
(flock -n 9)
나는 다음과 같은 결과를 얻었습니다: (
flock: 9: Mauvais descripteur de fichier
잘못된 파일 설명자).
따라서 서브쉘이 먼저 (...) 9> toto.txt
.
하지만 이렇게 하면:
(ls -l /proc/$$/fd) 9> toto.txt
total 0
lrwx------ 1 laurent laurent 64 déc. 16 00:24 0 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc. 16 00:24 1 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc. 16 00:24 2 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc. 16 00:24 255 -> /dev/pts/2
파일 설명자 9가 나열되지 않습니다. 그럼 무리가 그것을 여는 책임이 있는 것 같나요?
서브쉘 내부와 외부 사이의 "핸드셰이크" 단계와 그 순서를 설명할 수 있는 사람이 있습니까?
답변1
비교는 다음과 같습니다.
sh -c 'ls -l /proc/$$/fd' 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
l-wx------ 1 chris chris 64 Dec 16 11:24 9 -> /tmp/toto.txt
sh -c "ls -l /proc/$$/fd" 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0
( ls -l /proc/$$/fd ) 9>/tmp/toto.txt # Your own example
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0
첫 번째 예에서는 $$
서브쉘에 속합니다. 두 번째 경우에도 귀하의 상황에 $$
따라부모 쉘명령이 실행되기 전에.
이제 원래 질문에 대답하려면,
이 bash 명령의 여러 단계는 어떤 순서로 완료됩니까?
(flock -n 9) 9> toto.txt
이것은POSIX에 의해 정의됨:
- 쉘은 파일(sh 참조), -c 옵션 또는 POSIX.1-2017 시스템 인터페이스 볼륨에 정의된 system() 및 popen() 함수에서 입력을 읽습니다. 셸 명령 파일의 첫 번째 줄이 "#!" 문자로 시작하면 결과가 지정되지 않습니다.
- 셸은 입력을 토큰으로 나눕니다. 단어와 연산자는 토큰 인식을 참조하세요.
- 쉘은 입력을 간단한 명령(단순 명령 참조)과 복합 명령(복합 명령 참조)으로 구문 분석합니다.
- 쉘은 각 명령의 다른 부분에 대해 (별도로) 다양한 확장을 수행하여 명령 및 인수로 처리되는 경로 이름 및 필드 목록을 생성합니다.
- 쉘은 리디렉션(리디렉션 참조)을 수행하고 인수 목록에서 리디렉션 연산자와 해당 피연산자를 제거합니다.
- 쉘은 함수(함수 정의 명령 참조), 내장 함수(특수 내장 유틸리티 참조), 실행 파일 또는 스크립트를 실행하여 1부터 n까지의 위치 인수 형식으로 매개변수 이름과 명령 이름을 제공합니다. (또는 스크립트 내의 스크립트 기능의 경우) 위치 인수 번호 0으로 사용됩니다(명령 검색 및 실행 참조).
- 쉘은 선택적으로 명령이 완료되고 종료 상태를 수집할 때까지 기다릴 수 있습니다(명령의 종료 상태 참조).