Dash shell无法使用双引号执行给定的命令

时间:2013-12-09 15:05:09

标签: bash shell ubuntu sh dash-shell

我在使用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

2 个答案:

答案 0 :(得分:3)

在第一个版本中,双引号保护exec参数中的空格不被shell解释,因此exec会看到一个单词,其中有一个空格,“ls -lt”。没有该名称的程序,因此失败。在第二个版本中,shell会看到空格。

您不需要arg值的空格,因为在第二个版本中,无论如何,您在$cmd$arg之间都有空格,但它不会执行任何操作危害。在这个简单的例子中,你实际上根本不需要任何引号,但如果你养成包含它们的习惯,你就不会忘记它们。

答案 1 :(得分:1)

你的第一个exec正试图找到一个命令“ls -lt”(包含空格作为命令名的一部分。而你的第二个例子(不使用引号),正在按你的意图运行命令, 'ls'是命令而'-lt'是该命令的参数。