/ / Як надрукувати знак оклику в bash? [дублювати] - linux, bash, unix, scripting

Як надрукувати знак оклику в bash? [дублікат] - linux, bash, unix, сценаріїв

Мені потрібно printf простий скрипт і перенаправити вихідний файл, але коли я роблю це:

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

Я отримую цю помилку:

bash:! / bin / bashntouch: подія не знайдено

Якщо я уникаю знак оклику:

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

Потім у файлі все ще присутній символ аварії.

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

До речі, в даному випадку, файл #! / Bin / bash ПОВИНЕН бути в файлі. З певних причин двійковий файл, який виконує скрипт, не читає файл інакше.

Відповіді:

8 для відповіді № 1

The ! Символ розширюється в рядках з подвійним цитуванням, але не в рядках, що містять один рядок.

printf "#!/bin/bashntouch /tmp/1234567890_""$RUN"

Він також не розширюється, коли він з'являється сам по собі або в кінці слова; це не так чисто, але:

printf "#%c/bin/bashntouch /tmp/1234567890_$RUN" !

Можна також тимчасово вимкнути заміну історії (тимчасово) $histchars до порожнього рядка; це вимикає особливу обробку !:

histchars=
printf "#!/bin/bashntouch /tmp/1234567890_$RUN"
unset histchars

Або ви можете виконати printf команду в сценарії, а не в інтерактивному режимі (заміна історії за замовчуванням увімкнена лише для інтерактивних оболонок).


6 для відповіді № 2

Спробуйте це зробити:

printf "41"

Це вісімкове представлення ASCII ! характер

Побачити

man ascii

Інше рішення:

(
set +o histexpand
printf "!"
)

(дужки використовуються для зміни налаштувань терміналу в a добової оболонки, тому зміна є тимчасовою)

Побачити

help set
set -o