2013-02-21 3 views
2

мне нужно PRINTF простого скрипта, и перенаправить вывод в файл, но когда я делаю это:Как распечатать восклицательный знак в bash?

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

Я получаю эту ошибку:

Баша:!/Bin/баш \ 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 ДОЛЖЕН быть в файле. По какой-то причине двоичный файл, который выполняет скрипт, в противном случае не будет читать файл.

ответ

7

! характер раскрывается в двойных кавычках, но не в однокасканных строках.

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 в сценарии, а не в интерактивном режиме (история замена по умолчанию только для интерактивных оболочек).

+0

ах, это имеет смысл. – David

+0

хорошо catch ................! – Satish

+0

@David: Я обновил свой ответ еще несколькими альтернативами. –

6

Попробуйте сделать это:

printf "\041" 

Это восьмеричный ASCII представление ! характера

См

man ascii 

Другое решение:

(
    set +o histexpand 
    printf "!" 
) 

(скобка используются для изменения терминала настройки в подоболочка, поэтому изменение носит временный характер)

См

help set 
set -o 
+0

Спасибо! Я об этом не думал. – David

+0

На самом деле, это работает только в одинарных кавычках, а также printf '!'. – David

+0

Посмотрите мое второе решение в моем отредактированном сообщении –

Смежные вопросы