如何在bash中打印感叹号?

我需要printf一个简单的脚本,并将输出redirect到一个文件,但是当我这样做:

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

我得到这个错误:

bash:!/ bin / bash \ ntouch:未find事件

如果我逃过感叹号:

 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空字符串来临时关闭历史记录替换; 这关闭了特别的待遇!

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

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

尝试这样做:

 printf "\041" 

这是!的八进制ASCII表示! 字符

看到

 man ascii 

另一个方案

 ( set +o histexpand printf "!" ) 

(圆括号用于更改子shell中的终端设置,所以更改是暂时的)

看到

 help set set -o