패싸움에서 닭이 먼저냐 달걀이 먼저냐는 이상한 질문

패싸움에서 닭이 먼저냐 달걀이 먼저냐는 이상한 질문

이 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에 의해 정의됨:

  1. 쉘은 파일(sh 참조), -c 옵션 또는 POSIX.1-2017 시스템 인터페이스 볼륨에 정의된 system() 및 popen() 함수에서 입력을 읽습니다. 셸 명령 파일의 첫 번째 줄이 "#!" 문자로 시작하면 결과가 지정되지 않습니다.
  2. 셸은 입력을 토큰으로 나눕니다. 단어와 연산자는 토큰 인식을 참조하세요.
  3. 쉘은 입력을 간단한 명령(단순 명령 참조)과 복합 명령(복합 명령 참조)으로 구문 분석합니다.
  4. 쉘은 각 명령의 다른 부분에 대해 (별도로) 다양한 확장을 수행하여 명령 및 인수로 처리되는 경로 이름 및 필드 목록을 생성합니다.
  5. 쉘은 리디렉션(리디렉션 참조)을 수행하고 인수 목록에서 리디렉션 연산자와 해당 피연산자를 제거합니다.
  6. 쉘은 함수(함수 정의 명령 참조), 내장 함수(특수 내장 유틸리티 참조), 실행 파일 또는 스크립트를 실행하여 1부터 n까지의 위치 인수 형식으로 매개변수 이름과 명령 이름을 제공합니다. (또는 스크립트 내의 스크립트 기능의 경우) 위치 인수 번호 0으로 사용됩니다(명령 검색 및 실행 참조).
  7. 쉘은 선택적으로 명령이 완료되고 종료 상태를 수집할 때까지 기다릴 수 있습니다(명령의 종료 상태 참조).

관련 정보