当我在sh中运行以下时:
myCommand
我明白了:
Lorem\nipsum\tdolores
然而,当我执行以下操作时:
x=`myCommand`; echo "$x"
我明白了:
Lorem
ipsum dolores
如何在将命令替换存储到变量时阻止sh解释转义序列?
答案 0 :(得分:2)
根据echo
的POSIX规范,您描述的行为是完全允许的:您的sh
使用的是echo
的XSI扩展形式,而您已经习惯了BSD行为或bash的不合规默认混合(默认是因为bash也有一个兼容的echo
,虽然它已关闭,除非xpg_echo
和posix
选项都设置;不合规因为默认实现基于行为切换存在-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"