我正在学习exec命令。我知道该exec命令替换了启动它的进程。所以不可能返回到被exec命令替换的进程。
可以说它的目的是使其无法返回到启动它的过程。
但是将类似的东西exec作为命令使用还有什么其他用途?
sou*_* c. 13
该exec 命令用指定的 命令替换当前的 shell 进程。通常,当您运行命令时,会产生(分叉)一个新进程。该exec 命令不会产生新进程。相反,当前进程被新命令覆盖。换句话说,该exec命令代替当前 shell 执行,而无需创建新进程。
exec 命令有三种最常见的用途:
示例 1:
如果您打开一个新的bashshell
$ bash
Run Code Online (Sandbox Code Playgroud)
在pstree它看起来像
??gnome-终端
??bash???bash???pstree
以前的bashshell 仍然存在,并且您获得了一个新的bashshell。而如果你打开一个新的 bash shell,
$ exec bash
Run Code Online (Sandbox Code Playgroud)
该pstree节目
??gnome-终端
??bash?pstree
在这里,旧bash的被新的取代。在一个命令中退出多次登录特别有用。它更安全,并消除了错误地离开开放终端的机会。请参阅使用一个命令从 root 和用户退出
示例 2:您可以将文件打开为
$ exec vi filename.txt
Run Code Online (Sandbox Code Playgroud)
当您退出时vi,无需单独关闭终端,因为外壳已被替换。一旦您关闭 vi,终端也将关闭。
该exec 命令还可用于 shell 脚本中动态打开、关闭和复制文件描述符。这允许将 STDIN、STDERR、STDOUT 和其他文件描述符重定向到 shell 脚本内的各种文件,而不是命令调用字符串。如果不指定命令或参数,则可以指定重定向符号和文件描述符来执行这些功能。
假设你有一个 shell 脚本,script.sh你想要一个日志文件script.log,你可以使用exec,
LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1
Run Code Online (Sandbox Code Playgroud)
这相当于
./script &>> /path/to/script.log
./script >> /path/to/script.log 2>&1
Run Code Online (Sandbox Code Playgroud)
您还可以使用 exec 命令来创建一组 shell 脚本,它们像进程的各个阶段一样依次执行。每次需要将控制权转移到执行 exec 命令的下一个脚本时,无需生成新进程。
在这种情况下,每个阶段的最后一条语句应该是exec调用下一个阶段的命令。
有关更多信息,请参阅shell 脚本中命令的使用exec。
注:以上部分内容摘自这里。
Anw*_*war 11
exec 主要用于包装脚本。
如果您想在执行主程序之前修改程序的环境,您通常会编写一个脚本并在脚本的最后启动主程序。但是此时脚本不需要留在内存中。所以,exec在这些情况下使用,以便主程序可以替换母脚本。
这是一个实际的例子。它的mate-terminal.wrapper脚本带有mate-terminal。它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);
Run Code Online (Sandbox Code Playgroud)
这里要注意的一点是,有一个exec调用,它替换了内存中的这个脚本。
这是在 Unix 和 Linux StackExchange 站点中回答的类似问题 - https://unix.stackexchange.com/q/270929/19288
的另一个常见用途exec是重定向文件描述符。stdin, stdout,stderr可以使用 exec 重定向到文件。
重定向stdout-exec 1>file将导致标准输出成为以file当前 shell 会话结束命名的文件。要输出到显示器的任何内容都将在文件中。
重定向stdin- 它还可以用于重定向stdin到文件。例如,如果你想执行一个脚本文件script.sh,你可以stdin使用exec 0<script.sh.
| 归档时间: |
|
| 查看次数: |
14437 次 |
| 最近记录: |