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

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



답변

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


답변

간단한 초보자 친화적 인 짧은 답변으로 허용되는 답변을 늘리기 위해 필요하지 않을 것입니다 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명령 이름 대신 경로 재 지정이 뒤 따르는 부분에 대해서는 매뉴얼을 참조하십시오 .


답변