linux - 如何在 bash 中打印感叹号?

标签 linux bash unix scripting

<分区>

我需要打印一个简单的脚本并将输出重定向到一个文件,但是当我这样做时:

printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh

我收到这个错误:

bash: !/bin/bash\ntouch: 找不到事件

如果我避开感叹号:

printf "#\!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh

然后转义字符仍然存在于文件中。

cat /tmp/password-change-script_$RUN.sh
#\!/bin/bash
touch /tmp/1234567890_111

顺便说一句,在这种特殊情况下,#!/bin/bash 必须在文件中。出于某种原因,执行脚本的二进制文件不会以其他方式读取文件。

最佳答案

! 字符在双引号字符串中展开,但在单引号字符串中不展开。

printf '#!/bin/bash\ntouch /tmp/1234567890_'"$RUN"

它单独出现或出现在单词末尾时也不会展开;这不是很干净但是:

printf "#%c/bin/bash\ntouch /tmp/1234567890_$RUN" !

您还可以通过(暂时)将 $histchars 设置为空字符串来暂时关闭历史替换;这将关闭 ! 的特殊处理:

histchars=
printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN"
unset histchars

或者您可以在脚本中而不是交互式地执行 printf 命令(默认情况下,历史替换仅对交互式 shell 启用)。

关于linux - 如何在 bash 中打印感叹号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15011824/

相关文章:

unix 命令 'tail' 丢失选项 '--line-buffered'

android - 如何在 AOSP 中按名称查找 Android 模块?

c++ - 我如何找出哪个 header /包含在源中声明了哪些变量?

linux - 如何使用 Sed 仅注释掉未注释的行并保持空白/空行 100% 完好无损?

bash - 在 AWK 中比较工程编号时出现奇怪的输出

c++ - 将 ostream::opfx/osfx 从 Unix 移植到 Linux

linux - 从 .so 文件中删除路径,以便 RPM check-buildroot 成功

linux - 获取函数指针以在我没有直接加载的共享库中运行

linux - 最大文件的打印尺寸和平均文件尺寸

windows - 阻止在匿名管道上读写