Как упоминает Томас в его ответе оболочка, используемая make
, отличается от оболочки, которую вы используете при запуске сценария вручную.
Как правило, если вы используете в сценарии функции, относящиеся к определенной оболочке, вы должны поместить эту конкретную оболочку в строку shebang.
Например:
#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"
Используйте параметр -f
. Он будет игнорировать несуществующие файлы.
От man rm
:
-f, --force
ignore nonexistent files and arguments, never prompt
[Часть "никогда не запрашивать" означает что (a) -f
отменяет любой ранее указанный параметр -i
или -I
, и (b) защищенные от записи файлы будут удалены без запроса.]
Без -f
, rm
будет жаловаться на отсутствующие файлы:
$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory
С -f
он будет молчать:
$ rm -f nonesuch
$
Проверьте параметр - force
( -f
) для rm
:
-f, - force
игнорировать несуществующие файлы и аргументы, никогда не запрашивать
Есть два основных способа: Если вы добавите параметр -f, то он не будет показывать ошибку "не существует" и два: (работает почти для любой команды) вместо того, чтобы просто выполнить команду "thecommand", выполните "thecommand 2>/dev/null", где "thecommand" - это команда, которую вы выполняете.
Вы заявили, что все еще хотите видеть другие результаты команды rm
при ее выполнении, но использование опции -f
подавит их. Вам нужно будет отфильтровать STDERR для того, что вам нужно, что немного сложно, учитывая, что вы хотите, чтобы все остальное отображалось.
Вы захотите использовать команду, подобную этой:
rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'
Объяснение команды:
-f
аргумент для принудительного выполнения и без запроса подтверждения или ошибок3>&1 1>&2 2>&3 3>&-
для переключения между STDOUT и STDERR для фильтрации (вы можете прочитать больше об этом здесь, если хотите| grep -v 'No such file or directory'
для фильтрации сообщения, которое вы не хотите видетьИтак, если вы просто хотите полностью подавить сообщения об ошибках, вы можете выполнить следующую команду:
rm filename 2> /dev/null
Эта команда перенаправляет STDERR в /dev/null, поэтому вы не увидите его при выполнении команды.
Если вы хотите, чтобы rm
не жаловался на отсутствующие файлы, но вам также нужен любой другой вывод от rm
, я бы предложил сначала проверить существование целевого файла и вызывать rm
(без флага -f
) только если файл действительно существует.
# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script
Вызов rm -f
на файле, который, например, не имеет прав пользователь-запись, удалит файл и также не выдаст обычного для этого сценария приглашения.
Если вы хотите использовать ту же идею с несколькими файлами, я бы создал определение функции, например:
qrm() {
for f
do
[ -e "$f" ] && rm "$f"
done
}
Используйте ее следующим образом: qrm file1 file2-does-not-exist *.txt etc here
Вы можете использовать -f
, так как он, согласно man-странице, будет:
Пытаться удалить файлы без запроса на подтверждения, независимо от разрешений файла. Если файл не существует, не выводите диагностическое сообщение и не изменяйте статус выхода, чтобы отразить ошибку. не выводите диагностическое сообщение и не изменяйте статус выхода для отражения ошибки. также помните Опция -f отменяет все предыдущие опции -i.
rm -f xyz-directory
ничего не подскажет и сделает именно то, что вы хотите.
В качестве альтернативы вы можете использовать команду find
с опцией -delete
. Это (очевидно) удалит только файлы, которые он найдет, поэтому никогда не предупреждает, если их нет. Примером может быть:
find /var/log/triffids/ -name "*.log" -mtime 30 -delete
, который будет искать в каталоге / var / log / triffids /
и удалять все файлы с суффиксом .log
, которые не изменялись более 30 дней.
Всегда рекомендуется запускать эти команды без опции -delete
, чтобы убедиться, что она находит нужные файлы.
Это взлом, но вы всегда можете коснуться
файла, который собираетесь удалить. Если он не существует, он будет создан, чтобы rm
мог его удалить.