【问题标题】:Using a command in echo gives a different result在 echo 中使用命令会产生不同的结果
【发布时间】:2017-06-24 14:32:23
【问题描述】:

我在 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 语法有什么问题吗?

【问题讨论】:

  • 如果您使用的是csh,请在您的问题中明确说明并添加相应的标签。

标签: shell freebsd csh subshell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于 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 在将参数传递给未引用的命令时会将 \n 替换为空格

    【讨论】:

    • FreeBSD上显示非法变量名错误信息。
    • 你用的是什么shell?,echo $SHELL
    • echo $SHELL 给了我 /bin/csh
    • unix.stackexchange.com/a/284226有人补充同样的问题,看来需要设置一个变量然后回显:set var = "`cat filename | tr '\t' '\n'`"; echo "$var";
    • 不走运,同样的输出:(
    【解决方案3】:
    echo "`cat filename | tr '\t' '\n'`"
    

    【讨论】:

    • 不适用于 FreeBSD。结果相同,显示在一行中。
    【解决方案4】:

    你应该使用

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

    【讨论】:

      【解决方案5】:

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

      为了改变你的shell运行:

      chsh -s /usr/local/bin/bash
      

      或者,您可以在终端中输入sh,然后在/bin/sh 中享受您的互动会话。

      如果您真的想使用 Bash,但这里有一个可能会有所帮助的线程:How to Install bash on FreeBSD

      附带说明:不建议在 FreeBSD 中永久更改 root 的 shell。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-28
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多