exec 명령을 사용할 수 있는 방법은 무엇입니까?

exec 명령을 사용할 수 있는 방법은 무엇입니까?

명령어를 배우고 있어요 exec. 나는 exec명령이 명령을 시작한 프로세스를 대체한다는 것을 알고 있습니다. 따라서 명령으로 대체된 프로세스로 돌아갈 수 없습니다 exec.

그 목적은 그것을 시작한 프로세스로 돌아갈 수 없도록 만드는 것이라고 말할 수 있습니다.

exec그러나 명령으로 사용할 수 있는 것과 같은 것을 다른 용도로 사용하는 것은 무엇입니까 ?

답변1

exec 명령은 현재 쉘 프로세스를 지정된 명령으로 바꿉니다. 일반적으로 명령을 실행하면 새 프로세스가 생성(분기)됩니다. 이 exec 명령은 새 프로세스를 생성하지 않습니다. 대신 현재 프로세스가 새 명령으로 겹쳐집니다. 즉, exec새 프로세스를 생성하지 않고 현재 셸 대신 명령이 실행됩니다.

exec 명령에는 세 가지 가장 일반적인 용도가 있습니다.

1. 공정 교체

예-1:bash다음과 같이 새 쉘을 열면

$ bash 

그 안에는 pstree다음과 같습니다

├─그놈 터미널
        ├─bash───bash───pstree

이전 bash쉘은 여전히 ​​존재하며 새 bash쉘이 생겼습니다. 반면에 새로운 bash 쉘을 열면,

$ exec bash

pstree

├─그놈 터미널
        ├─bash───pstree

여기서 오래된 것이 bash새 것으로 교체됩니다. 하나의 명령으로 다중 로그인을 종료하는 것이 특히 유용합니다.이는 더 안전하며 실수로 열린 터미널을 떠날 가능성을 근절합니다.보다하나의 명령으로 루트와 사용자 모두 종료

예-2:다음과 같이 파일을 열 수 있습니다.

$ exec vi filename.txt

종료할 때 vi쉘이 이미 교체되어 있으므로 별도로 터미널을 닫을 필요가 없습니다. vi를 닫자마자 터미널도 닫힙니다.

2. 쉘 스크립트 내에서 파일 설명자를 리디렉션하는 방법

exec 명령은 쉘 스크립트에서 파일 설명자를 동적으로 열고, 닫고, 복사하는 데 사용될 수도 있습니다. 이를 통해 명령 호출 문자열 대신 STDIN, STDERR, STDOUT 및 기타 파일 설명자를 쉘 스크립트 내부의 다양한 파일로 리디렉션할 수 있습니다. 명령이나 인수를 지정하지 않으면 리디렉션 기호와 파일 설명자를 지정하여 이러한 기능을 수행할 수 있습니다.

script.sh로그 파일을 갖고 싶은 쉘 스크립트가 있다고 가정하면 다음과 같이 script.log사용할 수 있습니다 exec.

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

이는 다음과 같습니다.

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. exec 명령을 사용하여 프로세스 단계 생성

또한 exec 명령을 사용하여 프로세스 단계와 같이 순차적으로 서로 실행하는 셸 스크립트 세트를 만들 수도 있습니다. 다음 스크립트로 제어권을 넘겨야 할 때마다 새로운 프로세스를 생성하는 대신 exec 명령을 실행합니다.

이 경우 각 단계의 마지막 문은 exec다음 단계를 호출하는 명령이어야 합니다.

보다exec쉘 스크립트에서 명령 사용이상.

메모:위의 일부는 다음에서 가져왔습니다.이것.

답변2

래퍼 스크립트에서

exec주로 래퍼 스크립트에 사용됩니다.

기본 프로그램을 실행하기 전에 프로그램 환경을 수정하려면 스크립트를 작성하고 마지막에 기본 프로그램을 시작하는 경우가 많습니다. 하지만 그 당시 스크립트가 메모리에 남아 있을 필요는 없습니다. 따라서 exec이러한 경우에는 메인 프로그램이 모 스크립트를 대체할 수 있도록 사용됩니다.

여기에 실제적인 예가 있습니다. 스크립트 에는 mate-terminal.wrapper메이트 터미널이 함께 제공됩니다. mate-terminal사용자 환경을 확인하여 몇 가지 추가 인수로 시작합니다 .

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

여기서 주목해야 할 점은 exec메모리에서 이 스크립트를 대체하는 호출이 있다는 것입니다.

다음은 Unix & Linux StackExchange 사이트에서 비슷한 질문에 대한 답변입니다.https://unix.stackexchange.com/q/270929/19288

파일 설명자를 리디렉션하려면

또 다른 일반적인 용도는 exec파일 설명자를 리디렉션하는 것입니다. stdin, stdout,은 stderrexec를 사용하여 파일로 리디렉션될 수 있습니다.

  1. 리디렉션 stdout- exec 1>file표준 출력이 file현재 쉘 세션의 끝을 나타내는 파일로 지정됩니다. 디스플레이에 출력할 모든 내용이 파일에 포함됩니다.

  2. 리디렉션 stdin- 파일을 리디렉션하는 데에도 사용할 수 있습니다 stdin. 예를 들어, 스크립트 파일을 실행하려면 를 사용하여 해당 파일로 script.sh리디렉션하면 됩니다 .stdinexec 0<script.sh

답변3

내가 아는 한 이는 bash 스크립트의 파일 설명자(예: STDOUT, STDERR, STDIN)를 리디렉션하는 데에도 사용됩니다.

예를 들어 STDIN 리디렉션을 사용하여 키보드 대신 파일에서 읽을 수 있고 STDOUT(또는 프로그램에 따라 STDERR일 수 있음) 리디렉션을 통해 터미널 대신 파일에 쓸 수 있습니다.

관련 정보