的Linux命令shell命令行奇怪的行为
问题描述:
请看看下面的命令:的Linux命令shell命令行奇怪的行为
[email protected]:~/usp$ cat file
c
b
a
[email protected]:~/usp$ x="cat file | sort"
[email protected]:~/usp$ $x
c
b
a
cat: |: 没有那个文件或目录
cat: sort: 没有那个文件或目录
我的问题是,为什么$ x的输出不是:
a
b
c
剂量双引号改变命令行为cat file | sort
?
答
发生了什么事是$x
作为单个命令执行。 shell不是“重新解析”$x
的内容,所以它不是特别设置重定向和产卵sort
。
发生什么是cat
得到三个参数:file
,|
和sort
。您在该目录中没有名为|
或sort
的文件,因此cat
无法打开它们。 (我猜是什么错误说反正)
你可以让你通过运行预期的结果:
eval "$x"
我会避免使用eval
如果可以的话,虽然,它can be dangerous 。
前缀你有LC_ALL=
命令,要求对国际网站帮助之前获得英语的错误消息。
例如LC_ALL= $x
。
这确实是什么错误消息说(没有这样的文件或目录)。 – EOL 2013-05-05 15:44:01
谢谢@Mat和@EOL。我希望在'until'命令中使用一个变量,例如'until $ var'来减少代码行,因为在不同情况下,'until'命令语句会有所不同。在其中一种情况下,我需要执行像'var =“command1 | command2”'这样的任务。现在它不起作用。有没有解决这个问题的另一种方法? – 2013-05-05 16:02:43
@ Wenhao Yang:你应该为此提出一个新问题,但一定要包括足够的细节,因为这看起来有点奇怪。你不能使用函数而不是变量吗? – Mat 2013-05-05 16:08:24