Мені потрібно 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 для відповіді № 1The !
Символ розширюється в рядках з подвійним цитуванням, але не в рядках, що містять один рядок.
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