[Пожалуйста, внимательно прочитайте комментарии, сопровождающие ваш вопрос, так как, похоже, вы не все делаете правильно с sudo
]
В bash
есть механизм под названием "подстановка истории", который включается в командной строке. Он позволяет вам вставить всю или часть предыдущей команды (отсюда и "история") в редактируемую команду.
Символ, запускающий подстановку истории, - !
. Например, !WORD
заменяется последней командой, начинающейся с WORD
. Если такой команды нет, bash
выдаст сообщение об ошибке, которое вы получили: bash: !WORD: событие не найдено
.
Если вам нужно набрать !
без активации механизма подстановки истории, вы должны либо экранировать его \!
или заключить его в одинарные кавычки '!'
.
Например: echo 'Пользователь ALL = NOPASSWD: ALL, !/bin/su' | ...
Если расширение истории не дает вам покоя, вы также можете отключить его с помощью set +H
, набирать команды без кавычек !
, и снова включить его позже с помощью set -H
.
В find
добавлен аргумент non_existent_dir
для генерации сообщения об ошибке.
#!/bin/bash
error=$(find. non_existent_dir 2>&1 > output.txt)
if (($?)); then
printf "%s\n%s\n%s\n" "message before" "$error" "message after" >> log.txt
fi
Пояснение:
2>&1 > output.txt
-stderr
(номер 2 )перенаправлен наstdout
(номер 1 )и stdout
на номер output.txt
.
$?
-статус завершения команды find
. find
завершается со статусом 0, если все файлы обработаны успешно, и больше 0, если возникают ошибки.
find. non_existent_dir 2>&1 > output.txt |
awk 'NR == 1 {print "start message"}
{print}
END {if(NR > 0) print "end message"}' >> log.txt
Пояснение:
find
такая же, как и в предыдущем варианте. awk
часть -Если ввод не содержит строк (ошибок не было ), он ничего не напечатает. NR == 1 {print "start message"}
-если это первая строка, вывести "стартовое сообщение". {print}
-просто напечатайте все входные строки. END {if(NR > 0) print "end message"}
-проверка в конце выполнения, были ли получены какие-либо строки из ввода(NR
-количество записей )? Если это так, напечатайте «конечное сообщение». Вы можете сделать функцию примерно такой:
function append()
{
if [[ -s /tmp/stderr ]]
then
{ echo -e '\nText you want like ***\n' >> log.txt
cat /tmp/stderr >> log.txt;
rm /tmp/stderr
}
fi
}
Затем выполните команду следующим образом:
$ find /some_dir -maxdepth 1 -mindepth 1 > outputFile.txt 2>/tmp/stderr;
$ append