我在使用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
答案 0 :(得分:3)
在第一个版本中,双引号保护exec参数中的空格不被shell解释,因此exec
会看到一个单词,其中有一个空格,“ls -lt”。没有该名称的程序,因此失败。在第二个版本中,shell会看到空格。
您不需要arg
值的空格,因为在第二个版本中,无论如何,您在$cmd
和$arg
之间都有空格,但它不会执行任何操作危害。在这个简单的例子中,你实际上根本不需要任何引号,但如果你养成包含它们的习惯,你就不会忘记它们。
答案 1 :(得分:1)
你的第一个exec正试图找到一个命令“ls -lt”(包含空格作为命令名的一部分。而你的第二个例子(不使用引号),正在按你的意图运行命令, 'ls'是命令而'-lt'是该命令的参数。