Нет, в
может запускать только неинтерактивные сценарии.
Эти сценарии будут выполняться без подключения к терминалу, с которого вы запустили команду at
. Если программа выводит что-то в своем потоке stdout
и / или stderr
, этот вывод будет отправлен вам по почте.
Некоторые переменные не сохраняются при запуске сценария, особенно DISPLAY
, что является причиной неудачной попытки. Вы можете просмотреть свою почту, чтобы узнать, не сообщается ли об ошибке. В противном случае sendmail
или аналогичный, вероятно, не установлен / не настроен.
Если вы хотите использовать текущий дисплей X11 при выполнении команды, вы можете установить его следующим образом:
echo "DISPLAY=$DISPLAY alarm.sh \"-i It's time to ring up the revenue service\"" | at 15:00
Наконец-то я нашел ответ. Мне просто нужно указать полный путь к файлу fnames.txt в /path/to/my/fnames.txt, потому что я выполняю скрипт в другом каталоге.
#!/bin/sh
#
#
while read -r LINE
do
find -name "$LINE"
done < /path/to/my/fnames.txt
Выход:
./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat
./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat
Причина в порядке, в котором оболочка обрабатывает различные расширения и кавычки. Если вы наберете
напрямуюfind. -name "foo*"
Оболочка удалит кавычки и передаст foo*
в качестве параметра в find
.
Без кавычек оболочка сначала выполнит подстановку для *
, что потенциально может привести к множественным совпадениям, что приведет к путанице find
. Поэтому разумно использовать кавычки.
Но если вы read
выберете строку из файла, переменная будет содержать кавычки. Теперь, когда вы это сделаете
> echo $LINE
"foo*"
> echo "foo*"
foo*
> find. -name $LINE
вы видите, что кавычки $LINE
не будут удалены, в отличие от кавычек для echo "foo*"
. Это связано с тем, что оболочка сначала обрабатывает кавычки echo $LINE
(, а )нет, а затем выполняет подстановку переменных, поэтому строка будет читаться как echo "foo*"
, но теперь кавычки остаются.
Итак, ваш find
будет искать файлы, содержащие кавычки. Решение состоит в том, чтобы оставить кавычки в файле. Там кавычки не нужны, вся строка будет идти в переменную.
Измените IFS
на :
while IFS=\" read -r x LINE x; do
find. -name "$LINE"
done < fnames.txt
Это **по существу удалит кавычки **, а $LINE
будет тем, что вам нужно find
для правильной работы. Что он делает, так это разделяет строку, прочитанную на кавычки, и поэтому они не будут отображаться в $LINE.