KSH for loop работает на Solaris/Mac, но не на Red Hat Linux.

Следующий сценарий Ksh выдает мне сообщение об ошибке «Нет такого файла или каталога» в системе Red Hat Linux. У кого-нибудь есть решение?

#!/usr/bin/ksh
for f in `cat files.dat`
do
  wc $f
done

Например, files.dat имеет 3 строки данных, и каждая строка представляет собой файл в текущем каталоге, из которого запускается скрипт.

a.c
a.h
b.c

Обратите внимание, что тот же цикл for генерировал такое же сообщение об ошибке, если запускался из командной строки.

Он работает на Solaris/Mac, но не на системе Red Hat.

Спасибо.


person user527414    schedule 02.12.2010    source источник
comment
Является ли ошибка Нет такого файла или каталога созданным для ksh или для files.dat?   -  person crnlx    schedule 02.12.2010
comment
Ошибка для a.c, a.h и b.c, поскольку cat files.dat эквивалентно a.c a.h b.c.   -  person user527414    schedule 02.12.2010


Ответы (2)


Вместо for ... cat следует использовать

while read -r f
do
    wc "$f"
done < files.dat

И вы должны использовать $() вместо обратных кавычек, когда вам нужно выполнить подстановку команд.

Но ваша проблема, вероятно, в том, что файлы a.c и т. д. отсутствуют, имеют разные имена, невидимые символы в именах или строки, оканчивающиеся на files.dat, являются CR/LF (стиль DOS/Windows) вместо \n (только LF - в стиле Unix) или в противном случае в файле есть нечетные символы.

person Dennis Williamson    schedule 02.12.2010
comment
Исходный файл files.dat был создан с использованием перенаправления вывода команды find, что вызвало ошибку. Я проверил содержимое этого файла с помощью команды od -c, но там нет странного символа. В любом случае, спасибо за оперативные ответы. - person user527414; 02.12.2010

Вы должны правильно цитировать свои аргументы, другими словами, использовать "$f", а не $f. О кошке в основном документировано здесь: http://porkmail.org/era/unix/award.html

Что, вероятно, лучше подходит, так это xargs -a thatfile wc.

person user502515    schedule 02.12.2010
comment
Цель состоит в том, чтобы использовать egrep для сопоставления некоторых шаблонов с $f и перенаправить вывод grep в файл, но я получил эту ошибку. Затем я попытался просто запустить wc и получил ту же ошибку. Поскольку сейчас у меня нет доступа к RH Box, я попробую $f завтра. Спасибо. - person user527414; 02.12.2010