语境
我有一个文件my-cmd
:
echo '<some data...>\\<some other data...>'
基本上,我想将此命令的输出重定向到文本文件:
./my-cmd > file.txt
问题
我的问题是>
总是替换任何出现的\\
to \
in file.txt
。
我怎样才能防止这种行为?
答案1
如果my-cmd
做这样的事情:
echo "abc\\def"
输出将是abc\def
:反斜杠被解释为双引号内的转义字符。 OTOH,它被视为单引号内的文字反斜杠:
echo 'abc\\def'
将产生abc\\def
作为输出。
编辑:这是用 bash 测试的。 OP 已将标签更改为“zsh”,因此这并不能回答他的问题。如果版主认为现在无关紧要,我会删除它。
答案2
echo
是一个不可移植的命令,其行为因实现、版本、编译时和运行时选项以及环境而异。
-
特别是,如果它的第一个参数可能以以下开头(尽管 zsh 的内置函数echo
是可以解决该问题的罕见实现之一)或者任何参数包含反斜杠字符,则不应使用它。
具体来说,对于zsh
echo
内置实现,\
序列(如\n
、\c
、\61
、\\
...)会被扩展(根据 POSIX+XSI 的要求,而没有 XSI 的 POSIX 会保留未指定的行为),除非bsdecho
启用该选项(在大多数部署中默认禁用),而因为bash
它们仅在xpg_echo
启用时才会展开(在大多数部署中默认禁用)。
zsh
和s都bash
echo
支持(非标准)-E
选项来禁用扩展(bash
如果同时启用xpg_echo
和选项,则 s 不支持)。posix
在这里,即使你可以这样做:
echo -E '<some data...>\\<some other data...>' > file
zsh
在大多数部署中都可以正常工作bash
,使用标准命令会更好printf
:
printf '%s\n' '<some data...>\\<some other data...>' > file
在这种情况下,其行为完全由 POSIX 指定,并且在所有实现中都相同。
请注意,该printf
实用程序是 POSIX 发明。早在 POSIX 出现之前,Korn shell 对这种不可移植的echo
混乱的解决方案是一个新的print
内置函数及其-r
不扩展\x
序列的选项和一个-
标记选项结束的选项。zsh
确实有一个类似 Korn 的print
内置函数,但bash
没有。
在 ksh 和 zsh 中,您还可以执行以下操作:
print -r - "$var"
按原样打印任意数据。
更多详情请参见:
答案3
答案4
回答
如您所知,这>
是一个输出重定向操作符(本质上意味着它将命令的输出重定向到某个位置)
如果您想将多个输出重定向到同一个文件,那么您应该使用该>>
命令。它使用与命令相同的语法>
,但不会完全重写/删除之前重定向的数据,而是将其添加到下面。
示例/语法
./my-cmd > file.txt
所以不要做,而是做./my-cmd >> file.txt