В этом фрагменте есть несколько ошибок, но, как ни странно, двойная проверка файлов не входит в их число.
Во-первых, конструкция $ ()
вокруг find
неверна, как показывает @EricRenouf. Правильный способ сделать это - использовать что-то вроде
while read filename
do
source $filename
done < <(find ....)
, которое вызывает find в подоболочке и считывает имена файлов в переменную filename
в основной оболочке (это find | при чтении x
идея с ног на голову, но, к сожалению, не такая переносимая)
Во-вторых, проверка каталога -d
является избыточной; find
не найдет никаких файлов, если каталог не существует, поэтому проверка его существования не имеет смысла.
Однако аргумент -типа f
в find
не проверяет то же самое, что аргумент -f
в test
. POSIX имеет следующее , чтобы сказать о тесте
:
-f pathname
Истинно, если pathname преобразуется в существующую запись каталога для обычный файл. False, если путь не может быть разрешен или если путь разрешается в существующую запись каталога для файла, который не является обычным файлом.
и имеет это , чтобы сказать о find
:
-type c
Первичный файл должен оцениваться как истинный, если тип файла - c , где c - это 'b', 'c', 'd', 'l', 'p', 'f' или 's' для специального файла блока, специального символа файл, каталог, символическая ссылка, FIFO, обычный файл или сокет соответственно.
Итак, если у вас есть обычный файл, который «не может быть разрешен», то у вас есть файл, для которого test -f
завершится ошибкой, но find -type f
завершится успешно. . Один из способов сделать это - иметь файл в каталоге, который вы можете читать, но не можете получить доступ:
wouter@gangtai:~$ ls -ld foo
drw-r--r--. 2 wouter wouter 4096 apr 1 18:38 foo
wouter@gangtai:~$ find foo -type f | while read file; do if [ -f $file ]; then echo $file tests -f; else echo $file does not test -f; fi; done
foo/bar does not test -f
wouter@gangtai:~$ ls -l foo
ls: cannot access 'foo/bar': Permission denied
total 0
-????????? ? ? ? ? ? bar
тип файла (будь то каталог, обычный файл или что-то еще) может быть обнаружено, если у вас есть r
, но нет x
, разрешений на каталог, в котором хранится файл. Однако, чтобы иметь возможность «разрешить» его (т.е. вызвать одну из функций stat ()
для этого файла), вам понадобится бит разрешения x
для этого каталога.
Конечно, полезен ли вообще такой тест в скрипте оболочки для вашего .bashrc
- это другой вопрос. Я бы сказал, что нет. Однако это не означает, что эти два теста одинаковы, и есть случаи, когда эта разница важна ...
Если вы прочитаете документацию по cron, вы увидите, что вам нужно использовать команду crontab -e и ввести запись, например:
0 23 * * * /path/to/executable
crontab "filename"
Откройте имя файла
и передайте 00 23 * * * "cmd"
Сохраните и закройте файл.
Чтобы перечислить содержимое crontab:
crontab -l
Чтобы отредактировать crontab:
crontab -e
Вы добавляете следующую строку в / etc / crontab
:
0 23 * * * yael /path/to/task
где yael
- это пользователь, запускает задачу, а / путь / к / задаче
- это путь к сценарию оболочки или команде, которую вы хотите запустить.