쉘 스크립트에서 exec 명령의 용도는 무엇입니까?


249

누구나 간단한 예제로 쉘 스크립팅에서 exec 명령의 사용법을 설명 할 수 있습니까?


31
linux.about.com에 대한 링크는 도움이되지 않습니다. 'exec'를 사용하여 명령 또는 명령 파이프 라인을 실행하는 것이 정상적으로 실행하는 것과 다른 점을 원격으로 명확하게하지는 않습니다. 따라서 OP의 질문은 "exec의 사용은 무엇입니까?"
Jonathan Hartley

2
스택 오버플로는 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제가 아닌 것 같습니다. 참조 내가 여기에 대해 요청할 수 있습니다 어떤 주제 도움말 센터에서. 아마도 Super User 또는 Unix & Linux Stack Exchange 가 더 좋은 곳일 것입니다.
jww

답변:


281

exec내장 명령은 커널에서 기능을 미러링하며 , 기본적으로 execveC에서 호출되는를 기반으로 하는 기능이 있습니다.

execfork새 프로세스를 수행 하지 않고 현재 프로세스의 현재 프로그램을 대체합니다 . 작성하는 모든 스크립트에서 사용하는 것은 아니지만 가끔 유용합니다. 여기 내가 사용한 몇 가지 시나리오가 있습니다.

  1. 우리는 사용자가 쉘에 액세스하지 않고 특정 응용 프로그램을 실행하기를 원합니다. / etc / passwd에서 로그인 프로그램을 변경할 수 있지만 시작 파일에서 환경 설정을 사용하고 싶을 수도 있습니다. 따라서 (예) .profile에서 마지막 문장은 다음과 같이 말합니다.

     exec appln-program

    다시 돌아 가야 할 쉘이 없습니다. appln-program충돌이 발생 하더라도 최종 사용자는 쉘이 없으므로 exec교체 할 수 없습니다.

  2. / etc / passwd에있는 다른 쉘을 사용하려고합니다. 어리석은 것처럼 보일 수 있지만 일부 사이트에서는 사용자가 로그인 셸을 변경할 수 없습니다. 내가 아는 한 사이트는 모두가로 시작했으며 모두 csh.login(csh 시작 파일)에 전화를 걸었습니다 ksh. 그것이 작동하는 동안, 그것은 길 잃은 csh프로세스를 떠났고 , 로그 아웃은 혼란 스러울 수있는 두 단계였습니다. 그래서 우리는 exec ksh방금 c-shell 프로그램을 korn 쉘로 대체하고 모든 것을 더 간단하게 변경했습니다 ( ksh로그인 쉘이 아니라는 사실과 같은 다른 문제가 있습니다 ).

  3. 프로세스를 저장하기 위해. 우리가 prog1 -> prog2 -> prog3 -> prog4등 을 호출 하고 다시 돌아 가지 않으면 각 호출을 exec로 만드십시오. 리소스를 절약하고 (반복하지 않는 한 당연하지는 않지만) 셧다운을 간소화합니다.

exec아마도 어딘가에 사용 된 것을 보았을 것입니다. 아마도 버그가있는 코드를 보여 주면 사용을 정당화 할 수 있습니다.

편집 : 위의 답변이 불완전하다는 것을 깨달았습니다. 거기 의 사용 exec쉘이 좋아하는에 kshbash파일을 여는 설명에 사용이 -. 여기 몇 가지 예가 있어요.

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

22
을 통해 나는 보통 WSGI 웹 응용 프로그램 (장고 말하거나 플라스크)를 실행 나는 아주 편리하고 가치가 당신 (멋진) 사이에 뭔가를 파이썬 웹 응용 프로그램에 관한 것 때문에 여기에 언급 응답 2, 3 발견 다른 사용도 거기 감독 발신 gunicorn은 응용 프로그램 : 후자는 상당히 많은 환경 변수가 필요하다는 악명 높은 것으로, 모든 것을 설정하고 궁극적 exec gunicorn으로 감독자에게 올바른 pid를 제공 하는 쉘 스크립트에서 gunicorn을 더 쉽고 유지 보수 할 수 있습니다.
gru

1
워드 프로세서가이 말을 할 exec재 지정에 사용 할 수 있습니다> 명령이 지정되지 않은 경우, 어떤 리디렉션은 현재 쉘에 적용하고, 반환 상태는 0입니다 리디렉션 오류가있는 경우, 반환 상태는 1입니다하지만 어떻게 합니까 exec실제로 파일 디스크립터를 변경하려고 노력합니까? 이 작업에이 특정 명령이 선택된 이유는 무엇입니까? (Markdown이 지금 실패하고 있습니까?)
Ray

@Ray : 내가 할 수있는 최선 : pubs.opengroup.org/onlinepubs/009604599/utilities/exec.html . 방법을 알아야 할 경우 쉘 소스 코드를보십시오.
cdarke

7
다른 용도 : 모든 스크립트의 출력을 로그 파일로 리디렉션exec >.\logfilename.log 2>&1
Hogan

1
@Carmageddon : &>bash확장 ( man bash)이며 예제 는와 동일합니다 exec >/var/log/userdata.log 2>&1. 즉, stdout 및 stderr을 해당 파일로 리디렉션합니다. 다음 명령은 재설정되지 않는 한 해당 리디렉션을 상속하지만 실행됩니다.
cdarke

41

간단한 초보자 친화적 인 짧은 답변으로 허용되는 답변을 늘리기 위해 필요하지 않을 것입니다 exec.

여전히 여기에 있다면 다음 토론에서 그 이유를 밝혀야합니다. 달릴 때

sh -c 'command'

sh인스턴스 를 실행 한 다음 command해당 sh인스턴스 의 자식으로 시작 합니다. 시 command마감의 sh경우도 완료됩니다.

sh -c 'exec command'

sh인스턴스를 실행 한 다음 해당 인스턴스를 이진으로 바꾸고 대신 실행합니다.shcommand

물론,이 둘은이 제한된 맥락에서 쓸모가 없습니다. 당신은 단순히 원합니다

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명령 이름 대신 경로 재 지정이 뒤 따르는 부분에 대해서는 매뉴얼을 참조하십시오 .


2
자신 만의 스파이 쉘을 부르는 유혹에 저항하십시오 bush. 물론 이것은 bash일반적인 유닉스 쉘 에도 적용됩니다 . @anishsane 메모 와 마찬가지로 Bash bash -c 'command'는 실제로 수행하여 비밀리에 최적화 합니다 exec command.
tripleee

1
쉘의 종료 코드는 일반적으로 마지막으로 실행 한 명령의 종료 코드입니다. 물론, 쉘이 실행되지 않거나 명령을 실행하지 못하면, 쉘의 종료 상태에 적절한 오류 코드가 표시됩니다.
tripleee

2
@JonathanLeffler 나는 초보자 질문에서 볼 수있는 반 패턴을 의도적으로 문서화하고 있습니다. 이것은 이 복제본에 의해 프롬프트 되었지만 이전에 보았으므로 구체적으로 다루고 싶었습니다.
tripleee

2
@JonathanLeffler 경미한 단어 조정; 이것으로 충분합니까? 피드백 감사드립니다.
tripleee

2
감사합니다-이 최적화에 대한 간단한 단락을 추가했습니다. 다른 이의가 있거나 다른 각도에서 사물을 설명하고 싶다면 분명하지 않습니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.