내가 아는 한, Linux에는 우리가 실행하는 모든 명령을 처리하는 두 가지 실행 단계가 있습니다. 원래 단어를 모르기 때문에 이해하는 대로 이름을 지정하겠습니다.
쉘 처리 --- 명령을 편집하는 쉘(개별 행으로 분할 등)은 모두 현재 쉘과 다른 쉘에서 수행됩니다.
쉘 처리 후의 실행 결과(우리가 사용한 원래 쉘에서)
누군가 이러한 작업의 이름이 무엇인지 대답하고 새로운 학습자에게 가장 적합하다고 생각하는 읽기 자료를 참조할 수 있습니까?
답변1
- 쉘 처리 --- 쉘 편집 명령(다른 라인으로 분할 등)
네, 그렇죠. 셸은 명령을 단일 문자열(일반적으로 입력 줄)로 받아 최종적으로 실행되는 실행 파일로 실제로 이동하는 문자열 집합으로 변환합니다. 쉘은 공백으로 구분된 단어를 단일 문자열에서 여러 문자열로 분할하고 따옴표, 확장 변수 등도 처리합니다.
그처럼
ls "$options" "/filename with spaces"
(의 값 ) 및 (따옴표 제거) 의 세 가지 문자열 ls
이 생성될 수 있습니다 . 이는 실행 중인 프로그램의 시스템 호출 에 전달됩니다 .-l
$options
/filename with spaces
exec()
이 모든 작업은 현재 쉘과 다른 쉘에서 수행됩니다.
아니 정말. 일부 셸 확장(예: $( ... )
)은 어려운 작업을 수행하기 위해 하위 셸을 생성하지만 일반적인 "간단한" 명령줄에서는 이런 일이 발생하지 않습니다.
- 쉘 처리 후의 실행 결과(우리가 사용한 원래 쉘에서)
명령줄을 구문 분석한 후 프로그램의 실제 실행은 논리적으로 별도의 단계입니다. 그러나 기술적으로 이것은 다른 프로세스에서 발생합니다. 왜냐하면 Unix에서 다른 프로그램을 실행하는 방법에는 fork()
첫 번째 프로세스의 복사본으로 새 프로세스를 생성하는 첫 번째 호출이 포함되고, 그런 다음 exec()
이를 복사본의 실제 프로그램(쉘)으로 대체하기 위해 호출하는 것이 포함되기 때문입니다. 실행합니다( ls
예제에서 언급됨).
명령이 exec
( 로 시작 하면 exec ls
포크가 건너뛰고 쉘이 시작 중이던 명령으로 대체됩니다.
주석에서 언급했듯이 쉘 내장 기능( echo
많은 쉘에서와 마찬가지로)도 분기 없이 동일한 프로세스에서 실행되는 경우가 많습니다.
(위의 모든 내용은 다소 단순화되었습니다. 실제 쉘에는 여기에 설명되지 않은 다른 기능이 있을 수 있습니다.)