명령어를 배우고 있어요 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
,은 stderr
exec를 사용하여 파일로 리디렉션될 수 있습니다.
리디렉션
stdout
-exec 1>file
표준 출력이file
현재 쉘 세션의 끝을 나타내는 파일로 지정됩니다. 디스플레이에 출력할 모든 내용이 파일에 포함됩니다.리디렉션
stdin
- 파일을 리디렉션하는 데에도 사용할 수 있습니다stdin
. 예를 들어, 스크립트 파일을 실행하려면 를 사용하여 해당 파일로script.sh
리디렉션하면 됩니다 .stdin
exec 0<script.sh
답변3
내가 아는 한 이는 bash 스크립트의 파일 설명자(예: STDOUT, STDERR, STDIN)를 리디렉션하는 데에도 사용됩니다.
예를 들어 STDIN 리디렉션을 사용하여 키보드 대신 파일에서 읽을 수 있고 STDOUT(또는 프로그램에 따라 STDERR일 수 있음) 리디렉션을 통해 터미널 대신 파일에 쓸 수 있습니다.