Linux 命令和单引号

Linux command and single quote

我认为单引号只是将每个字符的字面值保留在引号内,除了那些字符转义情况外,不会干扰命令结果。

例如,下面的两条命令返回相同的结果。

$ ls /home/testuser/tmp1
$ ls '/home/testuser/tmp1'

下面这条命令运行成功。

$ cp /home/testuser/tmp1/* /home/testuser/tmp2

但是下面的命令运行出错了。

$ cp '/home/testuser/tmp1/*' /home/testuser/tmp2 
cp: cannot stat '/home/testuser/tmp1/*': No such file or directory

我做错了什么?

* 就是你所说的字符转义情况。由于您保留了 * 的字面值,因此它失去了 "all files" 的含义,并且 cp 而是尝试复制一个字面上名为 *.

的文件

当你运行:

cp /home/testuser/tmp1/* /home/testuser/tmp2 

shell会透明地重写成:

cp /home/testuser/tmp1/bar /home/testuser/tmp1/foo /home/testuser/tmp2 

此过程称为 "pathname expansion" 或 "globbing"。当您引用 * 时,不会发生此重写。