当我尝试执行时ls|more
,命令运行正常,但是当我尝试将命令保存在类似的变量中x='ls|more'
,然后使用它执行时,$x
出现以下错误:
ls:无法访问 |:没有此文件或目录
ls:无法访问更多:没有此文件或目录
为什么?
答案1
当你执行
ls|more
shell 解析该行,并将这三个标记理解为命令ls
后跟管道,后跟命令more
。当您执行
$x
shell 会扩展该变量,但不会解析结果,至少不会以相同的方式解析。它会在空格处拆分变量的内容,将第一个字符序列作为命令名称,将后面的字符序列作为参数。因此,它会将 理解ls|more
为命令ls|more
,ls | more
将 理解为命令ls
后跟参数|
,more
并将ls
理解为文件名。
要让 shell 重新解析该变量的内容,请使用eval
,如下所示:
eval "$x"