在 echo 中使用命令会给出不同的结果



我在 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 显示与实际命令输出不同?回显中的语法有什么问题吗?

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

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

来自@mateusz-piotrowski和@ismael-luceno的回答:你不能,你需要另一个外壳。通过以下方式改变全局:

chsh -s /usr/local/bin/bash

或者只是在脚本顶部添加:

#!/usr/local/bin/bash

对于 freebsd 上的非默认 shell:

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

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

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

echo "`cat filename | tr 't' 'n'`"
你应该

使用

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

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

为了更改您的外壳运行:

chsh -s /usr/local/bin/bash

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

如果你真的想使用 Bash,这里有一个线程可能会有所帮助: 如何在 FreeBSD 上安装 bash。

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

最新更新