在echo中使用命令会产生不同的结果

时间:2017-02-07 11:09:31

标签: shell freebsd csh subshell

我在FreeBSD上运行以下命令:

$ cat filename | tr '\t' '\n'
#Output
DOCS     : ON

NLS      : ON

RCSI     : ON

$ echo `cat filename | tr '\t' '\n'`
#Output
DOCS     : ON NLS      : ON RCSI     : ON

为什么echo不显示与实际命令输出相同? echo中的语法有什么问题吗?

5 个答案:

答案 0 :(得分:1)

对于csh shell,freebsd上的默认shell:

来自@ mateusz-piotrowski和@ ismael-luceno回答: 你不能,你需要另一个shell。 用:改变全局:

chsh -s /usr/local/bin/bash

或只是添加到脚本的顶部:

#!/usr/local/bin/bash

对于freebsd上的非默认shell:

您需要在子命令中添加引号:

echo "`cat filename | tr '\t' '\n'`"

这是因为bash在没有引用的情况下将参数传递给命令时会用空格替换\ n

答案 1 :(得分:1)

与sh / ksh不同,C shell将始终转换换行符,您要么避免使用命令扩展,要么在csh端使用一些转义代码+替换解决问题。

答案 2 :(得分:0)

echo "`cat filename | tr '\t' '\n'`"

答案 3 :(得分:0)

看起来解决问题的最简单方法是将shell更改为/bin/sh,如果您熟悉Bash,则应该适合您。

为了改变你的shell运行:

chsh -s /usr/local/bin/bash

或者,您只需在终端中输入sh即可享受/bin/sh中的互动环节。

如果你真的想使用Bash,那么这里有一个可能有帮助的帖子:How to Install bash on FreeBSD

作为旁注:不建议在FreeBSD中永久更改root的shell。

答案 4 :(得分:0)

你应该使用

foreach line (`cat a | tr '\t' '\n'`")
  echo $line
end