Я хотел бы написать скрипт оболочки, который проверяет, существует ли определенный файл archived_sensor_data.json
, и если да, то удаляет его. После http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html я попробовал следующее:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Однако это выдает ошибку
[-e: command not found
когда я пытаюсь запустить полученный test_controller
скрипт, используя ./test_controller
команду. Что не так с кодом?
Ответы:
Вам не хватает необходимого пространства между скобкой и
-e
:источник
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. Сценарий, кажется, работает сейчас.if [ -e "$1" ]
(входной аргумент имени файла).Вот альтернативный метод с использованием
ls
:Если вы хотите скрыть любой вывод,
ls
чтобы видеть только да или нет, перенаправьтеstdout
иstderr
на/dev/null
:источник
ls
успешно, такой файл есть, в противном случае его нет». Еслиls
не удалось, это не значит, что файл отсутствует. Это может быть какая-то другая ошибка. Например, создайте файл в каталоге, принадлежащем пользователю root, и попробуйте сделать этоls
под обычным пользователем. Это не удастсяPermission denied
, что не эквивалентно тому, что файл не существует.Обоснованием моей рекомендации по решению является история друга, который на второй неделе своей первой работы вытер половину сервера сборки. Итак, основная задача - выяснить, существует ли файл, и если да, давайте его удалим. Но на этой реке есть несколько коварных порогов:
Все это файл.
Скрипты имеют реальную силу, только если они решают общие задачи
В общем, мы используем переменные
Мы часто используем -f force в скриптах, чтобы избежать ручного вмешательства
А также люблю -r рекурсив, чтобы убедиться, что мы создаем, копируем и уничтожаем своевременно.
Рассмотрим следующий сценарий:
У нас есть файл, который мы хотим удалить: filesexists.json
Это имя файла хранится в переменной
У нас также есть переменная пути, чтобы сделать вещи действительно гибкими
Итак, давайте посмотрим, если
-e
делает то, что он должен. Файлы существуют?Оно делает. Магия.
Однако, что произойдет, если переменная файла будет случайно оценена как nuffin '
Какой? Он должен вернуться с ошибкой ... И это начало истории, как вся эта папка была удалена случайно
Альтернативой может быть проверка специально для того, что мы понимаем как «файл»
Итак, файл существует ...
Так что это не файл и, возможно, мы не хотим удалять весь этот каталог
man test
имеет следующее сказать:источник
Внутренне, команда rm должна проверять существование файла в любом случае,
так зачем добавлять еще один тест? Просто выпуск
и после этого он исчезнет, был ли он там или нет.
Используйте rm -f, если вы не хотите получать сообщения о несуществующих файлах.
Если вам нужно предпринять какие-либо действия, если файл НЕ существует, то вы должны проверить это самостоятельно. Исходя из вашего примера кода, в данном случае это не так.
источник
Если вы используете NFS, «тест» - лучшее решение, потому что вы можете добавить к нему тайм-аут, если ваш NFS не работает:
Конструкция «[-e my_file]» будет зависать до тех пор, пока NFS снова не заработает:
источник
test
и[
являются синонимами. Вы также можете использоватьtimeout
с[
, аtest
также зависает, если NFS зависает.