1

我在带有 dash shell 的 Ubuntu 环境中遇到了一些示例代码的问题。

当在 Ubuntu Server OS 的 dash shell 中执行以下代码块时,我得到了如下所示的输出。

#!/bin/sh
cmd="ls"
arg=" -lt"
exec "$cmd $arg"

输出1:

./test3.sh: 4: exec: ls  -lt: not found

但是,如果我运行以下修改后的代码,那么我会得到正确的输出,如下所示。

#!/bin/sh
cmd="ls"
arg=" -lt"
exec $cmd $arg

输出2:

root@ubuntu:~/test# ./test3.sh total 6164
-rwxr-xr-x 1 root root      45 Dec 10 05:40 test3.sh
-rw-r--r-- 1 root root   35962 Dec 10 03:29 debug.txt
4

2 回答 2

3

在第一个版本中,双引号保护 exec 参数中的空格不被 shell 解释,因此exec看到一个带有空格的单词,“ls -lt”。没有那个名字的程序,所以它失败了。在第二个版本中,shell 看到了空间。

您不需要 的值中的空格arg,因为在第二个版本中$cmd,无论如何,and之间都有一个空格$arg,但这不会造成任何伤害。在这种简单的情况下,您实际上根本不需要任何引号,但是如果您习惯于包含它们,则在需要时不会忘记它们。

于 2013-12-09T15:07:27.957 回答
1

您的第一个 exec 正在尝试查找命令“ls -lt”(将空格作为命令名称的一部分。而您的第二个示例(不使用引号)正在按照您的意图运行命令,使用 'ls'是命令,'-lt' 是该命令的参数。

于 2013-12-09T15:08:53.553 回答