#! /usr/bin/env bash
for f in "$@"; do
echo "$f"
done
Необходимо заключить в кавычки $@
потому что для аргументов возможно содержать пробелы (или новые строки, и т.д.), если Вы заключаете им в кавычки или выходите из них с a \
. Например:
./myscript one 'two three'
Это - два аргумента, а не три, из-за кавычек. Если Вы не заключаете в кавычки $@
, те аргументы будут разбиты в рамках сценария.
]Да, []IN_CREATE[
] даст (или, по крайней мере, может дать) вам пустой файл. Как видно из названия, событие генерируется при создании нового файла, а новые файлы создаются пустыми. Возможно, что к тому времени, как процесс, получивший уведомление, обходит чтение файла, он не будет пустым, но, как правило, в этот момент он не будет записан полностью.[
]Чтобы отреагировать на завершенный файл, []IN_WRITE_CLOSE[
] - это то, что вам нужно. Обратите внимание, что это событие вспыхнет, если процесс создания файла завершится неудачно. Чтобы избежать этого, общая стратегия заключается в том, чтобы процесс записал файл, а затем переименовал его (возможно, переместив в другой каталог). После этого Ваш монитор прослушает []IN_MOVED_FROM[
].[
]Вы можете наблюдать, какие события передаются в вашу директорию с помощью []inotifywait[
], чтобы проверить, как он ведет себя, когда ваш процесс запущен: [
$ inotifywait -m .
Setting up watches.
Watches established.
]
[]Например, после запуска []touch file[
] в том же каталоге:[
$ inotifywait -m .
Setting up watches.
Watches established.
./ CREATE file
./ OPEN file
./ ATTRIB file
./ CLOSE_WRITE,CLOSE file
]
[]Поскольку между созданием файла и его закрытием существует задержка, после события CREATE, как вы и предполагали, будет пустой файл. Обратите внимание на события, следующие после запуска:[
] [from time import sleep
with open("somefile", 'w') as somefile:
sleep(15)
somefile.write("...")
]
[]поэтому использование события CLOSE_WRITE звучит разумно.[
].