sh - 防止在命令替换中解释转义序列

时间:2017-05-10 13:04:57

标签: shell sh

当我在sh中运行以下时:

myCommand

我明白了:

Lorem\nipsum\tdolores

然而,当我执行以下操作时:

x=`myCommand`; echo "$x"

我明白了:

Lorem
ipsum       dolores

如何在将命令替换存储到变量时阻止sh解释转义序列?

1 个答案:

答案 0 :(得分:2)

根据echo的POSIX规范,您描述的行为是完全允许的:您的sh使用的是echo的XSI扩展形式,而您已经习惯了BSD行为或bash的不合规默认混合(默认是因为bash也有一个兼容的echo,虽然它已关闭,除非xpg_echoposix选项都设置;不合规因为默认实现基于行为切换存在-e选项,而POSIX不允许echo支持-n以外的任何选项 - 标准禁止扩展的极少数情况之一)。引用其POSIX specification

  

申请使用

     

不可能在所有POSIX系统中使用echo   除非-n(作为第一个参数)和转义序列都是   删去。

     

printf实用程序可以移植来模拟任何一个   echo实用程序的传统行为如下(假设   IFS有其标准值或未设置):

     

历史性的System V回声和对XSI实现的要求   在这卷POSIX.1-2008中相当于:

printf "%b\n" "$*"
     

BSD回声相当于:

if [ "X$1" = "X-n" ]; then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi
     

鼓励新应用使用printf代替echo

因此,你应该使用:

x=$(myCommand); printf '%s\n' "$x"