2013-10-16 53 views
0

作为输入,我有一个名为exp_multiple_512_0的文件,其中有11行包含数字。我正在使用zsh。为什么使用变量改变使用zsh的echo输出?

如果我做的:

echo $(cut -f1 exp_multiple_512_0) 

我:

0 100 200 300 400 500 600 700 800 900 1000 

但是,如果我通过改变我的路线:

v=$(cut -f1 exp_multiple_512_0) 
echo $v 

我:

0 
100 
200 
300 
400 
500 
600 
700 
800 
900 
1000 

但是,当我使用bash,我仍然得到:0 100 200 300 400 500 600 700 800 900 1000

我的问题是:

  • 什么应该是正确的行为?保持还是不回报?
  • 为什么使用中间变量允许我保持回车?
  • 我可以配置zsh的行为更像bash吗?

回答

0

最好的答案是从chepnet谁在注释中说:

的zsh不通过 默认情况下执行的参数扩展词分裂,这意味着任何嵌入换行符字面处理,而不是 作为字分离空白。 setopt SH_WORD_SPLIT使zsh 表现得像bash。问题在于echo $ v vs echo“$ v”,而不是 $(cut ...)。

-1

如之前提到的@chepner,zsh的不行为方式与庆典一样。

这里试图让你的解决方案在zsh和bash上都能工作,而不用改变zsh行为。试试看,改变你的echo $v到:

echo "$v" | tr '\n' ' ' 
1

使用引号您的回音:

echo "$(cut -f1 exp_multiple_512_0)" 

或者干脆:

cut -f1 exp_multiple_512_0 

然后你会得到换行符你得到在你的第二个命令。

如果没有外壳引号,则会为换行符打印空间。

+0

这很有趣。但是,我想避免这些换行符。我想了解为什么使用中间变量来改变结果。 –

+0

你使用zsh还是bash? – anubhava

+0

我实际上使用了两者。 zsh是我的交互式shell,我为我的脚本使用bash。在我的情况下,这是为bash,所以我没有任何问题,但我想了解为什么zsh的行为喜欢,我想要一个兼容的解决方案。 –