Я согласен с Ether, что вы предоставили слишком много информации, и что первая строка ошибки рассказывает вам о том, в чем состоит проблема.
Однако есть несколько возможных проблем, не упомянутых:
- Скрипт Perl не является исполняемым; используйте
chmod +x perlStemmer.pl
.
- Скрипт Perl не находится в каталоге вашего PATH; возможно добавьте "." до конца вашего PATH или используйте путь, чтобы указать сценарию оболочки, где его найти:
export PATH=$PATH:.
./perlStemmer.pl
Обратите внимание, что в сценариях оболочки обычно используется состояние выхода 0, чтобы обозначить успех, и 1, чтобы указать сбой. Внешне ваш сценарий Per изменил направление - используя 1, чтобы указать, что что-то было найдено, и 0, чтобы указать, что это не так. OTOH, ваш скрипт на самом деле не использует состояние выхода perlStemmer.pl, так что это не критично.
Также используется какой-то странный синтаксис оболочки, включая несколько заблудших (лишних, но не неправильных) точек с запятой в конце.
Однако при запуске появляются некоторые проблемы:
DIR=$5
for a in `ls $DIR*`
do
b=`basename $a`
perlStemmer.pl $a >> tmp
$b = filter.pl tmp
if [$b == 1]; then
Само по себе назначение DIR в порядке (хотя грустно заставлять людей вводить аргументы 5, когда вы собираетесь использовать только последний, кажется).
Команда ls
может не выполнять то, что вы имели в виду; если $5
является именем каталога, то все, что вы перечисляете, это все каталоги, которые начинаются с заданного имени, а не все файлы в подкаталоге ... оно в конечном итоге несколько похоже, но не совпадает с ls $DIR/*
, что, вероятно, вы имели в виду.
Следующие три строки в порядке. Когда-нибудь в будущем, когда вы лучше освоите основы, мы сможем обсудить trap
, чтобы убедиться, что tmp
не остается без дела; на данный момент это ненужная диверсия.
Следующая строка ужасно разбита:
$b = filter.pl tmp
Если b в настоящее время содержит abcd
, то эта строка пытается выполнить команду abcd
с аргументами '=', 'filter.pl' и 'tmp'. Это вряд ли то, что вы имели в виду; может также случиться так, что один из ваших файлов называется «информация», и когда эта строка выполняется, она выполняет команду «информация», которая является последней частью вашего вопроса.
Выглядит так, как будто вы можете искать состояние выхода результата запуска 'filter.pl' на выходе perlStemmer.pl - следующая строка предполагает это. Мы предполагаем, что у вас есть PATH и права доступа, также для этой программы.
Тестовая линия тоже сильно повреждена; если b содержит 'abcd', то он попытается выполнить команду '[abcd
' и, вероятно, не найдет ее. В общем, вам нужны пробелы в квадратных скобках.
Пересмотрен скрипт оболочки
Итак, вы, вероятно, хотите что-то вроде этого, предполагая, что «filter.pl» возвращает 0 (успех), когда файл описывает преступление, и ненулевое (отказ) в противном случае:
#!/bin/sh
DIR=$5
for a in `ls $DIR/*`
do
b=`basename $a`
perlStemmer.pl $a >> tmp
if filter.pl tmp
then
cp $a ../crimeStories/$b
echo "$a describes crime"
else
echo "$a does NOT describe crime"
fi
done
exit 0
А, при использовании trap
:
#!/bin/sh
DIR=$5
trap "rm -f tmp; exit 1" 0 1 2 3 13 15
for a in `ls $DIR/*`
do
b=`basename $a`
perlStemmer.pl $a >> tmp
$b = filter.pl tmp
if filter.pl tmp
then
cp $a ../crimeStories/$b
echo "$a describes crime"
else
echo "$a does NOT describe crime"
fi
done
rm -f tmp
trap 0
exit 0