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