我尝试使用类似命令
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`”。