“把 $'...' 当作处理换行符的手段”,这确实是很多 Shell 老手的惯用思维
'...' 的本职工作:ANSI-C 引用
首先, '...' 的正式名字叫 ANSI-C Quoting。
它的核心任务是:把像 n 、 t 这样的转义序列,翻译成真正的控制字符(换行、制表符)。
● 普通单引号 '...' :见啥吃啥, n 就是两个字符 和 n 。
● $'...' :会进行翻译, n 会被翻译成一个真正的“换行符”。
它是用来保护包含换行符、单引号、反斜杠的复杂文本,防止 Shell 解析器在半路把命令截断。
这就是为什么在那个复杂的嵌套 SSH 命令中,你会看到 bash -c $'...' —— 它是为了确保那一长串脚本(可能包含换行和引号)能作为一个完整的整体,被远程的 Bash 正确接收和执行。
bash -c echo 'It's a test
and a new line'
● Shell 解析:
1. bash (命令)
2. -c (参数)
3. echo (参数)
4. 'It' (参数)
5. s (参数) -> 报错!s 是什么?
6. 换行符 -> 命令截断!后面的东西被当成新命令了!
经过 printf '%q' 处理后(有了保护):
printf '%q' 把上面的内容转义成了:
$'echo '\''It\'\''s a test\nand a new line'\'''
bash -c $'echo '\''It\'\''s a test\nand a new line'\'''
● 它看到 $'...' ,它知道:“这是一整块字符串,里面不管有什么 n 或者 ' ,我都不要管,不要切分,直接把它作为 bash -c 的参数传进去。”