语境

语境

语境

我有一个文件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

根据弗雷迪说的话在评论中尼克德的回答my-cmd应该:

/bin/echo -E '<some data...>\\<some other data...>'

所以基本上,因为我zsh不是 bash,默认情况下我使用一个echo专门处理反斜杠字符的命令。我必须告诉zsh我想使用该/bin/echo命令,并且还必须使用其-E选项来调用它。

以下是man echo关于该-E选项的说明:

   -E     disable interpretation of backslash escapes

答案4

回答

如您所知,这>是一个输出重定向操作符(本质上意味着它将命令的输出重定向到某个位置)

如果您想将多个输出重定向到同一个文件,那么您应该使用该>>命令。它使用与命令相同的语法>,但不会完全重写/删除之前重定向的数据,而是将其添加到下面。

示例/语法

./my-cmd > file.txt所以不要做,而是做./my-cmd >> file.txt

相关内容