我需要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