【问题标题】:Linux command and single quoteLinux 命令和单引号
【发布时间】:2020-03-27 17:11:13
【问题描述】:

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

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

$ 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

我在这里做错了什么?

【问题讨论】:

  • 您明确阻止了 glob 扩展,因为它告诉您该目录中没有字面名称为 * 的文件。

标签: linux command single-quotes


【解决方案1】:

* 就是你所说的字符逃逸情况。由于您保留了 * 的字面值,它失去了“所有文件”的含义,而cp 尝试复制一个字面名称为 * 的文件。

当你运行时:

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

shell 会透明地将其重写为:

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

此过程称为“路径名扩展”或“通配”。当您引用* 时,不会发生这种重写。

【讨论】:

  • 感谢您的帮助。我使用单引号的原因是处理已安装的 Windows 文件系统,该文件系统在文件夹/文件名中有空格。现在我还有两个问题。 1. 我了解 Linux 接受文件/文件夹名称中的空格。但最佳做法是不要在任何名称中使用空格,对吗? 2. 如果目录名确实包含空格,我该如何处理这种文件掩码情况,即复制所有文件?
  • 对于我的第二个问题,我想我必须逃离这个空间,对吧?例如 cp /home/testuser/tmp\ 1/* /home/testuser/tmp2
  • 1.最好的做法是避免广泛分布的系统文件中的空格和外来字符,但是在用户数据文件的文件名中包含空格是很好的,并且任何不处理文件名(如Family Photos)的工具都被认为是错误的。有时用户会避免这种情况,以便他们可以为自己编写更草率的脚本,但这是他们的选择。 2. 您可以转义单个空格或仅引用所有除了*,如'/home/testuser/tmp1/'*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多