echo $'hi\nhi' > /etc/list.list 不起作用

echo $'hi\nhi' > /etc/list.list 不起作用

当我echo $’hi\nhi’ > /etc/list.list在 Kali Linux 2020.4 Live USB 上创建包含多个命令的可执行脚本文本文件时:

  1. $在文件文本中包含,同时消失 2 个’’符号。

  2. 无法创建一条新线,将 2hi彼此分开,而只是显示 根本\n没有分隔。

但是当我在可执行文件之外或普通终端中使用相同的命令时,它会起作用。

Kali 2020.4 是否从 2020.3 更改为不允许我在可执行文本文件中使用回显格式,因为它可以完美地工作?我可以使用其他命令echo在 1 行命令中创建新行吗?

答案1

您的命令存在许多问题,幸运的是它们都很容易解决:

  1. 作为卡西莫多在他们的评论中提到,不是用于分隔字符串的有效字符谍影重重 外壳(又名“BASH”,Kali Linux 上的默认 shell 解释器)。需要将其替换为单引号 ( ') 或双引号 ( )。"这里有一些很棒的信息在 BASH 中引用

  2. 您正在尝试使用“转义序列“在你的echo指挥范围内,但不提供-e旗帜。

  3. 基于您的事实$如果您希望在输出中包含美元符号字符 ( ),那么您似乎正在尝试执行“参数扩展“或(如钢铁起子在注释中)创建一个 [ANSI 引用字符串](https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html)。

根据 ANSI 引用的 GNU BASH 文档:

$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)将被解码

对转义序列的理解是这个答案的重要区别。我们可以选择 shell 扩展发生的位置:运行阶段echo 或者在使用 ANSI 引用时。做出这种区分是因为在某些情况下必须在外部完成指定这些类型的扩展才能echo达到所需的效果。经过进一步思考,我想起了awk一个我见过这个问题的工具:

使用反斜杠或单引号进行字段分隔

一般来说,我也会回顾“新手陷阱 - 变量BASH Hackers wiki 的部分,特别是“设置变量”和“扩展(使用)变量”的小节。

这些是 BASH 本身的基本语法问题,不会受到 Kali 次要版本更新的影响。

编辑:添加了 3a/3b 的细分以包括来自钢铁起子的评论。

相关内容