Неизвестная ошибка для скрипта bash! - PullRequest
0 голосов
/ 21 ноября 2010

Итак, у меня есть Perl-скрипт, который принимает 2 аргумента.

  1. каталог, ведущий к файлам .txt, который я заинтересован в поиске по
  2. файл, в котором есть слова, которые я преобразовал в массив.

Perl-файл (perlstemmer.pl):

#!/usr/bin/perl
use strict;
use warnings;

open(ALLFILES,"/Users/mymacbook/saver/rssFolders/txt") or die "Can't Open: $!\n";
open(TRIGGERFILE,"/Users/mymacbook/trigger.txt") or die "Can't Open: $!\n";

my $line=<>;
my %words;
my $i;
my @triggers =<TRIGGERFILE>;

while(<TRIGGERFILE>) #read each line into $_
{
   chomp @triggers;  # Remove newline from $_
   push @triggers, $_; # add the line to @triggers
   #/puts all txt from trigger.txt into the array @triggers. /
}

while($line ne "")
{
 %words = split(//, $line);
}

foreach $i(@triggers)
{
 if (exists $words{$i})
 {
  return 1;
 } 
 $line= <>; 
 return 0;
}

Итак, этот скрипт вернет 1, если файл содержит слово из массива @triggers, и 0, если его нет ....

Bash-скрипт organise.sh

Затем скрипт bash считывает, если он имеет 1:

#!/bin/sh
DIR=$5

for a in `ls $DIR*`
   do
   b=`basename $a`
   perlStemmer.pl $a >> tmp

   $b = filter.pl tmp
   if [$b == 1]; then
      cp $a ../crimeStories/$b
      echo "$a describes crime"
   else
       echo "$a does NOT describe crime"
   fi

 done;
exit 0;

-> Итак, скопируйте файл $ a, если он вернул 1., и напечатайте: что он описывает Иначе ... если он возвращает 0 скажи, что это не описывает преступление, и ничего не делай с ним: -)

Моя проблема

Я получаю сумасшедший терминал, когда пытаюсь запустить это:

>./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: perlStemmer.pl: command not found
./organise.sh: line 11: [perlStemmer.pl: command not found
perlStemmer.pl does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: version.plist: command not found
./organise.sh: line 11: [version.plist: command not found
version.plist does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: Jennie:: command not found
./organise.sh: line 11: [Jennie:: command not found
Jennie: does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: Assignment: command not found
./organise.sh: line 11: [Assignment: command not found
Assignment does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: 1.doc: command not found
./organise.sh: line 11: [1.doc: command not found
1.doc does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: Document.pdf: command not found
./organise.sh: line 11: [Document.pdf: command not found
Document.pdf does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: Gers: command not found
./organise.sh: line 11: [Gers: command not found
Gers does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: polo's: command not found
./organise.sh: line 11: [polo's: command not found
polo's does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found
./organise.sh: line 10: contact: command not found
./organise.sh: line 11: [contact: command not found
contact does NOT describe crime
./organise.sh: line 8: perlStemmer.pl: command not found

perlStemmer существует. Я попытался добавить к нему полный путь, но программа, похоже, ищет только папку, в которой находится perlStemmer.pl.

Я вижу, что это похоже на разделение имен файлов и папок.

Кто-нибудь знает, что я делаю неправильно или что может быть причиной этого в цикле?

Я также получаю это:

  This (the Directory node) gives a menu of major topics. 
  Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" 
  gives a primer for first-timers, "mEmacs<Return>" visits the Emacs topic,
  etc.
  In Emacs, you can click mouse button 2 on a menu item or cross reference
  to select it.
  --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) ---

* Menu: The list of major topics begins on the next line.

Emacs
* Ada mode: (ada-mode). The GNU Emacs mode for editing Ada.
* Autotype: (autotype). Convenient features for text that you enter frequently
                          in Emacs.
* CC Mode: (ccmode).   Emacs mode for editing C, C++, Objective-C,
                          Java, Pike, and IDL code.
* CL: (cl).             Partial Common Lisp support for Emacs Lisp.
* Dired-X: (dired-x).   Dired Extra Features.
* EUDC: (eudc).   A client for directory servers (LDAP, PH)
* Ebrowse: (ebrowse).   A C++ class browser for Emacs.
* Ediff: (ediff).       A visual interface for comparing and merging programs.
* Emacs: (emacs).       The extensible self-documenting text editor.
* Emacs FAQ: (efaq).    Frequently Asked Questions about Emacs.
* Emacs MIME: (emacs-mime).   The MIME de/composition library.
* Eshell: (eshell).     A command shell implemented in Emacs Lisp.
* Forms: (forms).       Emacs package for editing data bases
                          by filling in forms.
* Gnus: (gnus).         The newsreader Gnus.
* IDLWAVE: (idlwave).   Major mode and shell for IDL and WAVE/CL files.

* MH-E: (mh-e).         Emacs interface to the MH mail system.
* Message: (message).   Mail and news composition mode that goes with Gnus.
* PCL-CVS: (pcl-cvs).   Emacs front-end to CVS.
* RefTeX: (reftex).     Emacs support for LaTeX cross-references and citations.
* SC: (sc).             Supercite lets you cite parts of messages you're
                          replying to, in flexible ways.



* Speedbar: (speedbar).        File/Tag summarizing utility.
* VIP: (vip).           An older VI-emulation for Emacs.
* VIPER: (viper).       The newest Emacs VI-emulation mode.
                          (also, A VI Plan for Emacs Rescue
                           or the VI PERil.)

печать в терминале !!

Ответы [ 2 ]

1 голос
/ 21 ноября 2010

Я согласен с 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
1 голос
/ 21 ноября 2010

Этот вопрос невероятно длинный и излишний для реальной проблемы, обозначенной этой строкой:

./organise.sh: line 8: perlStemmer.pl

Включаемый вами Perl-скрипт совершенно не имеет значения, поскольку он даже не запускается .Начните с одной проблемы за раз и решайте их по очереди, чтобы не перегружать себя другими проблемами, которые еще не могут быть решены.

Ваш скрипт bash не может найти perlStemmer.pl.Это говорит о том, что вы не находитесь в правильном каталоге при запуске сценария, поскольку (поскольку вы не предоставляете никакой информации о пути), он будет искать только в каталогах в $PATH.

Вы можетеВы хотите проверить наличие некоторых ошибок, прежде чем приступить к выполнению оставшейся части сценария bash, как будто первая часть не сработала, вы просто получите мусор для остальных (как вы видите).


Кстати, у вашего скрипта есть несколько фундаментальных проблем, которые не позволяют ему делать что-либо полезное:

my @triggers =<TRIGGERFILE>;
while(<TRIGGERFILE>) #read each line into $_

Это считывает все содержимое файла в @triggers, поэтомуэтот цикл while будет немедленно прерван, поскольку вы уже находитесь в конце дескриптора файла.

while($line ne "")

Вы прочитали только одну строку в $line и не прочитали другую, поэтому эта строка будет либо зацикливатьсянавсегда или ничего не делать, в зависимости от того, является ли первая строка содержимого, которое вы передаете на stdin, пустой строкой (вероятно, первой, так как вы не взломалинамотай от него).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...