2012年3月28日星期三

Linux撞鬼集3之$()内嵌加管道(尚未解决)

由于自己比较菜,写linux脚本的时候总遇到一些很撞鬼的事情,比如说:
$(echo "echo hello")

这个的执行结果是:
hello

但是执行下面这个命令:
$(echo "echo hello | more")

结果你以为仍然一样,结果却是:
hello | more

嗯?为啥是这样的呢?抱歉,我不知道为什么。从我目前的认知来说,我以为$(xxx)的意思是执行xxx命令,并且再次执行该命令的输出。用第一个例子来描述,那就是:
echo "echo hello"

将会输出:
echo hello

而执行 echo hello 的结果,将会是:
hello

也就正好可以解释第一个例子的执行结果。可是到了第二个例子,我们推测
echo "echo hello | more"

的执行结果是:
echo hello | more

而上述语句的执行结果应该是
hello

这是因为该输出只有一行,more不会起任何影响。但是实际上第二个例子的结果却等同于:
echo "hello | more"

嗯,这就奇怪了,bash怎么会如此识别呢?如果说是自动根据IFS来添加双引号/单引号,那也应该是等价于下面这样的命令才对。
echo "hello" | "more"

好吧,我假定$()操作符将会根据输出结果按照IFS分割成两列,第一列作为命令,剩下的都作为参数,这样倒是能解释结果。可是,我要如何写才能得到等价于hello | more的执行结果呢,或者说达到这一个目的呢?

……呃,这个,非常抱歉,google这个玩意儿对于学习linux脚本编程天然鄙视。比如搜索“$()”,结果是木有啊木有,更不要说搜索“$() |”这样的玩意儿了……(泪奔ing)

P.S.:
$(echo "echo hello" | more)这个是可以的,但是这两者其实并不等价。比如说有一个有3行文字的文件a,执行cat a | head -n 1,现实的是一行。但是执行$(echo "cat a" | head -n1),却把所有文字都显示出来了。为啥?不知道,GOOGLE不告诉我……

没有评论:

发表评论