【问题标题】:Dash shell could not able to execute the given command with out double quotesDash shell 无法在没有双引号的情况下执行给定的命令
【发布时间】:2013-12-26 18:00:59
【问题描述】:

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

【问题讨论】:

    标签: bash shell ubuntu sh dash-shell


    【解决方案1】:

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

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

    【讨论】:

    • 感谢彼得的回答,我同意你的看法。我再次怀疑与使用双引号有关。如果字符串变量包含 n 或 t 字符,那么当我打印它们时我无法看到这些字符。但是如果我使用双引号,那么只有我能够在我的开发环境中打印它们。但在示例脚本中它工作正常。
    • 多诺万对此的评论是正确的。并非所有 shell 都会解释反斜杠字符,但 Dash 就是这样。
    【解决方案2】:

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

    【讨论】:

    • 感谢多诺万的帮助。在回复 Peters 评论 w.r.t n & t 字符在 shell 变量中时,我又问了一个问题。你也可以帮忙吗?
    • 我认为第二个问题的答案在于 shell 在双引号内插入变量。因此,特殊字符 \n (换行符)和 \t (制表符)在显示任何输出之前被解释。要打印文字 \t 或 \n,您需要使用单引号,shell 不会尝试对其进行插值。希望对您有所帮助。
    • 是的,我同意我们需要使用转义序列来打印 \n 或 \t 但在我的情况下,它只是普通的 n & t 字符。但这仅发生在我的开发环境中,其中脚本是一个非常大的文件。在示例脚本中,一切正常。不确定是什么设置使它不打印 n&t 个字符。
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2018-11-28
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多