Как решить ошибку "Word too long" в unix?
Я пишу сценарий оболочки TC под названием pl_dict в Unix, который принимает список английских слов в единственном числе в качестве входных данных и печатает форму множественного числа каждого слова в отдельной строке. Он использует файл, содержащий список слов на английском языке, и другую программу c, которая принимает английское слово в единственном числе в качестве аргумента и печатает множественное число слова. Вот мой код:
set dictionary = (/usr/share/dict/words)
set irregular = (/share/files/irregular.txt)
#go over all the input words
foreach word ($argv[*])
set irregularWord = `grep $word $irregular | cut -d" " -f1`
#the word is found in irregular.txt file
if ("$irregularWord" != "") then
gcc -o pluralize pluralize.c
./pluralize -f irregular.txt $word
else #the word is not found in the irregular file
#search for it in the dictionary
set realEnglishWord = `grep $word $dictionary`
#the word is a real English word
if ("$realEnglishWord" != "") then
gcc -o pluralize pluralize.c
./pluralize $word
else
echo "$word":" word not found in dictionary."
endif
endif
end
Это работает просто отлично, пока я не попробую запустить это: pl_dict fish foot foox house mouse
Вот вывод, который я получаю:
fish
feet
foox: word not found in dictionary.
Word too long.
В чем проблема и как я могу это исправить?
Спасибо.
4 ответа
Попробуйте следующие шаги:
Шаг 1:
sudo apt-get install tcsh
Шаг 2:
sudo update-alternatives --config csh
Выберите tcsh из списка доступных вариантов.
Я полагаю, что это сообщение программы pluralize
и нам нужен текст программы, чтобы помочь вам.
Кроме того, вам не нужно компилировать программу каждый раз, когда вы запускаете скрипт (gcc
линия). Вы можете сделать это один раз, а затем использовать двоичный файл.
Я просто столкнулся с этой же проблемой, и это было результатом расширения переменной оболочки, которая была "слишком длинной". Я также использовал grep, как это:
set test_error = "grep -P '^UVM_(ERROR|FATAL)\s+[^:]' $mylog
"
... который совпал с несколькими строками в $ mylog и стал $ test_error огромной многострочной строкой. Исправление состояло в том, чтобы использовать "-m 1" для остановки grep после первого совпадения, например так:
set test_error = "grep -P -m 1 '^UVM_(ERROR|FATAL)\s+[^:]' $mylog
"
В моем приложении мне нужен был только первый матч. Не уверен, будет ли это применяться к вашему использованию.
До tcsh 6.15 существует ограничение на максимальную длину на линию. Если я правильно помню, это 4K символов. Сообщение отображается, если ограничение нарушено.
Это часто вызвано тем, что оболочка расширяет длинную переменную. Я столкнулся с этой проблемой, когда пытался дважды развернуть сложный $PATH в одной строке.
Чтобы решить эту проблему, сначала найдите длинную переменную. использование
env | grep VARIABLE_NAME
и / или
set | grep VARIABLE_NAME
до раскрытия переменной, чтобы проверить подозреваемую переменную.
Кроме того, потому что результат grep
может быть тысячи строк (например, is
), если вы хотите точный результат, вы можете использовать <>
указать границу
grep "\<WORD\>" /usr/share/dict/words
или используя awk, как прокомментировал технозавр.