Я худею с вашего говнокода

Sep 26, 2019 12:58


Потерял почти целый рабочий день на одном странном затыке.

Задача. У нас есть обычный текстовый файл, в нем N строчек. Нужно запустить некоторое приложение также N раз, передав ему в качестве параметра очередную строчку из упомянутого файла. Казалось бы, что может быть проще?
#!/bin/bash

while read line ; do
/usr/bin/somecommand "$line"
done < somefile.txt

Всё прекрасно работает, как и ожидалось. Но теперь вместо somecommand берём некую Javaписьную утилиту. В моём конкретном случае это будет клиент для Jenkins-а. Примерно вот так (там надо ещё кой-какие переменные окружения в начале прописать, но суть не в этом).
#!/bin/bash

while read line ; do
/usr/bin/java -jar jenkins-cli.jar get-job "$line" >> someotherfile.xml
done < somefile.txt

...и с удивлением обнаруживаем, что этот цикл всегда выполняется ровно один раз независимо от количества строк в файле "somefile.txt".

Почему? Вот на выяснение этого я и потратил кучу времени. Оказывается, эта долбаная софтина по имени "jenkins-cli.jar" каким-то образом умудряется перехватить стандартный ввод (STDIN) у шелла, в котором выполняется цикл. Поэтому read внутри while читает первую строчку из файла somefile.txt, все остальные строчки забирает Javaписьный апплет при первом же проходе цикла, хотя логика его работы ни разу не предполагает ничего получать со стандартного ввода. А на следующем (втором) проходе цикла оператор read получает хрен EOF, и цикл заканчивается.

Причём такое происходит только с этой одной конкретной отдельно взятой программой. Если внутри цикла вызывать, например, просто "/usr/bin/java -version", то всё нормально.

В процессе своих экспериментов я чего только не перепробовал. И отдельные subshell-ы плодить, и по-хитрому ввод-вывод подменять, и вызывать через "/bin/bash -c блаблабла". Ничего не помогает. Вообще ничего. Перехватывает стандартный ввод у цикла, скотина такая, и всё тут. А сработало в итоге вот так:
#!/bin/bash

while read line ; do
/usr/bin/java -jar jenkins-cli.jar get-job "$line" 0>someotherfile.xml 2>/dev/null
done < somefile.txt

И меня слов других нет кроме бранных. Вот скажите, как это прикажете называть? И как они вообще это сделали? Говнокод в полный рост, я просто худею. На ровном месте "влетел" в совершенно непонятный косяк. За всю свою практику в первый раз с таким пидорством столкнулся. Java, хуле.

ненависть, работа, it, bash, java

Previous post Next post
Up