Оболочка Unix: превратить файл с именами каталогов в разделенный путь: - PullRequest
1 голос
/ 05 мая 2011

Я использую Java5 и не хочу указывать каждый файл .jar в Classpath, поэтому я попытался написать небольшой сценарий оболочки:

find $LIB_DIR -name '*.jar' -print > /tmp/classpath
CP= 
cat /tmp/classpath | while read line
do 
CP=$CP:$line
done 
rm -f /tmp/classpath

Но это не работает - переменная $ CP пуста.

В результате $ CP должна быть единственной строкой с путями, разделенными ':'

Кто-нибудь знает, что здесь не так и как правильно объединить все строки файла в одну строку?

Ответы [ 3 ]

5 голосов
/ 05 мая 2011

Ваш цикл while находится в под-оболочке, поэтому никакие переменные не будут переданы обратно в основную оболочку. Вы все равно хотите сделать что-то подобное:

CP=$(find $LIB_DIR -name '*.jar' -print | tr '\n' ':')

Это будет делать все, что вы хотите, в одной строке.

1 голос
/ 05 мая 2011

Проблема в том, что цикл while выполняется в отдельном экземпляре оболочки, а локальная переменная в нем ($CP) недоступна во внешней оболочке.

Что-то вроде

while read line; do
    CP="$CP:$line"
done < /tmp/classpath

должно работать. Но обратите внимание, что $CP заканчивается двоеточием в качестве первого символа, поэтому требуется некоторая постобработка.

Более того, вы должны использовать mktemp, иначе вы можете быть обмануты перезаписью файлов, если кто-то поместит символическую ссылку на /tmp/classpath.

0 голосов
/ 06 мая 2011

Чтобы пояснить, что упомянутый блок Uwe Kleine-König и Steve Baker пока готов, не является недолговечным по своей природе, но из-за использования трубы в этом кодовом блоке

cat /tmp/classpath | while read line
do 
CP=$CP:$line
done 

От Страница man Bash : «Каждая команда в конвейере выполняется как отдельный процесс (т. Е. В подоболочке).»

Подробнее о подоболочках .

См. Также другой ответ SO о трубе и подоболочках.

введите описание ссылки здесь

...