反引号中的 cp 参数不起作用?

反引号中的 cp 参数不起作用?

我尝试使用类似命令

cp `ls ~/temp/*.xyz | head -1` ./

但那不起作用。如果我在反引号内回显命令的值并将其手动放入 cp 命令中,它就会起作用。有什么想法吗?

答案1

反引号(或替代语法 )生成的文本$(…)(如替换变量 ( $foo) 生成的文本)由 shell 扩展:它被分解为单词,并且单词被解释为 glob 模式(即\[?*操作以匹配文件)。为了避免此问题,始终使用双引号括住变量和命令替换

还有第二个问题:ls由于各种原因,解析输出是一个坏主意。

如果你使用 zsh 作为你的 shell,那么执行你尝试的操作的一个简单方法是

cp ~/temp/*.xyz([1]) ./

在其他 shell 上,这更难。在命令行上,ls如果您知道文件不包含任何不可打印字符(对于ls的不可打印定义),您可能会冒险使用 。在脚本中,这会导致灾难;ksh 或 bash 中的简单两行代码是

tmp=(~/temp/*.xyz)
cp -- "${a[0]}" ./

在其他 shell 上,您可以按照这种方式执行此操作(请注意,这会覆盖位置参数):

set -- ~/temp/*.xyz
cp -- "$1" ./

答案2

也许匹配的文件包含特殊字符(例如空格),因此您需要引用反引号表达式:

cp “`ls ~/temp/*.xyz | head -1`”。

相关内容