这个 exec 命令在这种情况下应该如何工作?

这个 exec 命令在这种情况下应该如何工作?

我正在学习一本关于 UNIX 系统管理的教科书。Syed Mansoor 所著的《Unix 第三版》第 3 章。

第 13 章有以下 exec 用法的示例,该示例非常简单并且符合我的预期。

% /bin/csh
% exec date
Thu Jul 31 18:16:01 PKT 2014

然而,在本章后面,有这样的例子:

% cat sample
date
echo "Hello, world!"
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!

然而,当我尝试这个时,这就是我得到的:

$ exec < sample
$ $

这不是错字,这就是我的输出。我不明白为什么这里有差异。我在 PC-BSD 上运行它。本章中的解释是,该命令将当前 shell 的输入从 stdin 重定向到文件。因此它应该运行这些命令并将其输出打印到 stdout,这仍然是 shell。我也尝试过

exec < sample > /dev/tty

作为一种健全性检查(我认为),我理解这意味着将文件直接输入到当前 shell 并输出到默认终端,这是我正在使用的终端。但是,我得到了相同的结果。

最后,本节末尾出现了以下问题,尽管答案可以在他的 github 上找到,但我不太明白为什么我的尝试不起作用。我认为我确实理解该解决方案为何有效。问题:

编写一条命令,将 shell 的 stdin 更改为名为 data 的文件,将 stdout 更改为名为 out 的文件,这两个文件都位于当前工作目录中。如果数据文件包含以下几行,那么执行命令后会发生什么?

echo –n "The time now is: "
date
echo –n "The users presently logged on are: "
who

我尝试的解决方案是:

$ exec < data > out

我理解的意思是,将文件定向data到 shell 的输入并将 shell 的直接输出定向到文件out 解决方案是

( exec > out ; exec ./data )

我将其理解为一个分组命令,它在子shell中执行,首先将该子shell的输出定向到文件out,然后用data输出已重定向到该文件的可执行文件替换该子shellout

所以我的问题是:

  • 为什么教科书上的第二个示例可以在我的机器上运行?使用同一系统的 ISO,尽管作者的 PC-BSD 版本可能早了 9 年。我只将这个虚拟机专门用于这本教科书。
  • 为什么我的练习解决方案不起作用?
  • 我对作者的解决方案的理解正确吗?

谢谢您的考虑。 PS 我执行了chmod u+x这些示例中的每个可执行文件。

根据评论者的要求进行编辑 这是我对教科书示例的尝试,从头到尾。我无法完全复制+粘贴,因为我在虚拟机中,但我已经逐个字符地准确输入和输出,并且经过三次检查,我这样做没有错误。

[tony@pcbsd-8682] ~/ch12% cat > sample
date
echo "Hello, world!"
[tony@pcbsd-8682] ~/ch12% /bin/sh
$ exec < sample
$ [tony@pcbsd-8682] ~/ch12% file sample
sample: ASCII text

对于练习:

[tony@pcbsd-8682] ~/ch12/13.4d-redux% cat data
echo -n "The time now is: "
date
echo -n "The users presently logged on are: "
who
[tony@pcbsd-8682] ~/ch12/13.4d-redux% file data
date: ASCII text
[tony@pcbsd-8682] ~/ch12/13.4d-redux% /bin/sh
$ exec < data > out
$ [tony@pcbsd-8682] ~/ch12/13.4d-redux%

答案1

我想说你的教科书的剧本有错误。我像这样更改了脚本,然后它就起作用了:

% cat > sample
date
echo "Hello, world!"
# Press Ctrl-D (End Of File) here to stop entering data into file sample
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!

关于你的第二个问题,我不完全理解这个问题到底需要你做什么,但我尝试了你和教科书提供的解决方案。两者都将执行命令的结果从数据写入输出文件。所以,我想说,两者都是正确的。

相关内容