누구나 간단한 예제로 쉘 스크립팅에서 exec 명령의 사용법을 설명 할 수 있습니까?
누구나 간단한 예제로 쉘 스크립팅에서 exec 명령의 사용법을 설명 할 수 있습니까?
답변:
exec
내장 명령은 커널에서 기능을 미러링하며 , 기본적으로 execve
C에서 호출되는를 기반으로 하는 기능이 있습니다.
exec
fork
새 프로세스를 수행 하지 않고 현재 프로세스의 현재 프로그램을 대체합니다 . 작성하는 모든 스크립트에서 사용하는 것은 아니지만 가끔 유용합니다. 여기 내가 사용한 몇 가지 시나리오가 있습니다.
우리는 사용자가 쉘에 액세스하지 않고 특정 응용 프로그램을 실행하기를 원합니다. / etc / passwd에서 로그인 프로그램을 변경할 수 있지만 시작 파일에서 환경 설정을 사용하고 싶을 수도 있습니다. 따라서 (예) .profile
에서 마지막 문장은 다음과 같이 말합니다.
exec appln-program
다시 돌아 가야 할 쉘이 없습니다. appln-program
충돌이 발생 하더라도 최종 사용자는 쉘이 없으므로 exec
교체 할 수 없습니다.
/ etc / passwd에있는 다른 쉘을 사용하려고합니다. 어리석은 것처럼 보일 수 있지만 일부 사이트에서는 사용자가 로그인 셸을 변경할 수 없습니다. 내가 아는 한 사이트는 모두가로 시작했으며 모두 csh
가 .login
(csh 시작 파일)에 전화를 걸었습니다 ksh
. 그것이 작동하는 동안, 그것은 길 잃은 csh
프로세스를 떠났고 , 로그 아웃은 혼란 스러울 수있는 두 단계였습니다. 그래서 우리는 exec ksh
방금 c-shell 프로그램을 korn 쉘로 대체하고 모든 것을 더 간단하게 변경했습니다 ( ksh
로그인 쉘이 아니라는 사실과 같은 다른 문제가 있습니다 ).
프로세스를 저장하기 위해. 우리가 prog1 -> prog2 -> prog3 -> prog4
등 을 호출 하고 다시 돌아 가지 않으면 각 호출을 exec로 만드십시오. 리소스를 절약하고 (반복하지 않는 한 당연하지는 않지만) 셧다운을 간소화합니다.
exec
아마도 어딘가에 사용 된 것을 보았을 것입니다. 아마도 버그가있는 코드를 보여 주면 사용을 정당화 할 수 있습니다.
편집 : 위의 답변이 불완전하다는 것을 깨달았습니다. 거기 두 의 사용 exec
쉘이 좋아하는에 ksh
와 bash
파일을 여는 설명에 사용이 -. 여기 몇 가지 예가 있어요.
exec 3< thisfile # open "thisfile" for reading on file descriptor 3
exec 4> thatfile # open "thatfile" for writing on file descriptor 4
exec 8<> tother # open "tother" for reading and writing on fd 8
exec 6>> other # open "other" for appending on file descriptor 6
exec 5<&0 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4 # copy write file descriptor 4 onto 7
exec 3<&- # close the read file descriptor 3
exec 6>&- # close the write file descriptor 6
여기서 간격은 매우 중요합니다. fd 번호와 방향 전환 기호 사이에 공백을두면 exec
원래 의미로 되돌아갑니다.
exec 3 < thisfile # oops, overwrite the current program with command "3"
예를 들어 ksh use read -u
또는 print -u
, on bash
에서 여러 가지 방법을 사용할 수 있습니다 .
read <&3
echo stuff >&4
exec
재 지정에 사용 할 수 있습니다> 명령이 지정되지 않은 경우, 어떤 리디렉션은 현재 쉘에 적용하고, 반환 상태는 0입니다 리디렉션 오류가있는 경우, 반환 상태는 1입니다하지만 어떻게 합니까 exec
실제로 파일 디스크립터를 변경하려고 노력합니까? 이 작업에이 특정 명령이 선택된 이유는 무엇입니까? (Markdown이 지금 실패하고 있습니까?)
exec >.\logfilename.log 2>&1
&>
은 bash
확장 ( man bash
)이며 예제 는와 동일합니다 exec >/var/log/userdata.log 2>&1
. 즉, stdout 및 stderr을 해당 파일로 리디렉션합니다. 다음 명령은 재설정되지 않는 한 해당 리디렉션을 상속하지만 실행됩니다.
간단한 초보자 친화적 인 짧은 답변으로 허용되는 답변을 늘리기 위해 필요하지 않을 것입니다 exec
.
여전히 여기에 있다면 다음 토론에서 그 이유를 밝혀야합니다. 달릴 때
sh -c 'command'
sh
인스턴스 를 실행 한 다음 command
해당 sh
인스턴스 의 자식으로 시작 합니다. 시 command
마감의 sh
경우도 완료됩니다.
sh -c 'exec command'
sh
인스턴스를 실행 한 다음 해당 인스턴스를 이진으로 바꾸고 대신 실행합니다.sh
command
물론,이 둘은이 제한된 맥락에서 쓸모가 없습니다. 당신은 단순히 원합니다
command
쉘이 구성 파일을 읽거나 실행 환경을 설정하기 위해 환경을 설정하려는 경우가 있습니다 command
. 이것은 exec command
유용한 유일한 상황 입니다.
#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command
이것은 필요한 것을 포함하도록 환경을 준비하기 위해 몇 가지 일을합니다. 일단 완료되면 sh
인스턴스가 더 이상 필요하지 않으므로 sh
인스턴스를 하위 프로세스로 실행하고 기다린 다음 완료되는 즉시 종료 command
하지 않고 단순히 프로세스로 인스턴스를 바꾸는 것이 (최소한 ) 최적화 sh
입니다.
마찬가지로, 쉘 스크립트 끝에서 강력한 명령에 대해 가능한 한 많은 자원을 확보하려는 경우 exec
해당 명령을 최적화로 사용할 수 있습니다.
뭔가 힘 경우에 당신은 실행 sh
하지만 당신은 정말 뭔가를 실행하고 싶었다, exec something else
바람직하지 않은 대체 물론 해결 방법입니다 sh
예를 들어 당신이 정말로 자신의 규칙적인 실행하기를 원한다면 (같은 인스턴스를 gosh
대신 sh
하지만, 당신은에없는 /etc/shells
당신이 할 수 있도록 로그인 쉘로 지정하지 마십시오).
exec
파일 디스크립터를 조작 하는 두 번째 용도 는 별도의 주제입니다. 받아 들여진 대답은 그것을 훌륭하게 다루고 있습니다. 이 독립성을 유지하기 위해 exec
명령 이름 대신 경로 재 지정이 뒤 따르는 부분에 대해서는 매뉴얼을 참조하십시오 .