나는 에 익숙하지 않습니다 exec
. 나는 몇 가지 테스트와 예제를 실행하고 있었습니다. 파일에 작성된 명령을 전달하고 싶었습니다. 나는 그 명령이 exec
마치 명령줄에서 직접 실행되는 것처럼 실행될 것으로 기대하고 있습니다 . 제가 설정하고 시도한 내용은 다음과 같습니다.
[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test file2 file3
. . .
가장 이상한 부분은 다음과 같습니다. 마지막 줄을 실행해도 exec ls
반환되지 않습니다. 터미널이 정지되어 통신할 수 없습니다. 나는 이 마지막 문제가 서버에 SSH로 연결하는 데 사용하는 Mobaxterm의 문제일 수 있다고 생각합니다.
답변1
맨페이지 에서 bash
:
exec [-cl] [-a name] [command [arguments]]
가 지정 되면
command
쉘을 대체합니다. 새로운 프로세스가 생성되지 않습니다.[...]
지정하지 않으면
command
모든 리디렉션이 현재 셸에 적용되고 반환 상태는 0입니다.
파이프로exec
가장 먼저 시도한 것은
cat exec_test | exec
이는 인수가 아닌 표준 입력으로 전송 ls
됩니다 . 인수 없이 실행되고 리디렉션도 없으므로 아무 작업도 수행하지 않습니다.exec
exec
파일의 명령을 실행(또는 "실행")하려는 경우에는 해당되지 않습니다 exec
. source
(또는 약어 )를 사용하여 이를 수행할 수 있습니다 .
.
source exec_test
파이프로xargs exec
다음으로 시도한 것은
cat exec_test | xargs exec
exec
배쉬다내장. bash 내에서만 사용할 수 있으므로 xargs
실행할 수 없습니다.
exec
메인 쉘에서
마침내 당신은 노력했습니다
exec ls
이것은 실행된 ls
다음 터미널을 중단했습니다. 그 이유는 문서에 나와 있듯이 셸 프로세스를 대체했기 때문입니다. 완료 되면 ls
더 이상 터미널에서 실행되는 것이 없습니다. (일부 터미널 에뮬레이터는 이 시점에서 자동으로 닫힙니다. 다행히도 닫히지 않았으므로 계속 출력을 볼 수 있습니다.)
그만큼당신이 따르려고 했던 예추가 단계가 있었습니다:
bash
exec ls
bash
이것은 먼저 "최상위" 항목의 하위 항목으로 실행되는 새 를 시작합니다 . 그런 exec ls
다음 해당 쉘을 대체하고 종료됩니다. 그런 다음 상위 셸이 다시 시작되므로 터미널이 중단되지 않습니다.