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

Sep 26, 2019 12:58


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

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

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

Leave a comment

Comments 23

dn54 September 26 2019, 10:38:52 UTC
В классической проггерской дао-байке ты бы на третий день вспомнил, что сам и написал этот jenkins-cli.jar пять лет назад.

=:))

Reply


mindfactor September 26 2019, 10:47:04 UTC
Ну да, это же Java.

Я давным-давно сформулировал правило "если софт написан на Jave, то скорее всего это - полное говно". Из исключений пока только Vuze

Reply

hvostat_hvostat September 26 2019, 11:18:03 UTC
Джыра еще вроде ничего так.

Reply

klink0v September 26 2019, 11:19:39 UTC
Щас придет donz_ru бить нам морды и доказывать, что это я мудак. :) :) :)

Reply

cae32 September 26 2019, 11:39:19 UTC
Наблюдения за андроидом, говорят, что это не так уж далеко от истины :)

Reply


cae32 September 26 2019, 10:49:19 UTC
Гм.
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell

То есть, если запускаемый хочет STDIN, он таки его получит не из /dev/null, а таки из того, кто был родителем на время старта.

Reply

klink0v September 26 2019, 11:20:34 UTC
Хрен знает. Но вот так, как в последнем примере - работает. По-другому - не работает. С другим софтом подобных проблем никогда не было.

Reply

cae32 September 26 2019, 11:37:08 UTC
Не воспринимайте стороннюю программу, как соответствующую unix-way.
Нормальный grep или там sed будет брать параметры из cli, и только если их нет. займётся STDIN.
Но это же для сторонних утилит, скажем мягко, не совсем так. О чём думал автор, обычно загадка.
Поэтому, да, если сам держишь в скрипте STDIN, приходится заботиться о том, чтобы не отдать его кому-нибудь ненароком после fork.
Я последнее время даже trap не ленюсь писать в shell :)

Reply

klink0v September 26 2019, 11:46:27 UTC
А можно пример кода с trap-ами?

Reply


gutt_tlt September 26 2019, 19:34:55 UTC
Так это нормальное поведение, и Java здесь ни при чём.
Если не хочется приколов с stdin, то лучше сделать
for $(cat somefile.txt); do bla-bla-bla; done;
Вообще, всё, что связано с потоками ввода-вывода в шелле, достаточно запутанно для того, чтобы регулярно выстреливать себе в ногу. Вроде бы концепция простая. но вечно натыкаешься на какой-нибудь побочный эффект. Ну их.

Reply

klink0v September 26 2019, 19:44:58 UTC
Тогда уж "for line in $(cat somefile.txt)", наверное. Потому что мне эта переменная нужна внутри цикла.

Только вот не уверен что в моём случае так сработает. Потому что у меня строки файла содержат пробелы. Теоретически, можно заранее по нему пройтись sed-ом и всё заэкранировать, конечно...

Reply

gutt_tlt September 26 2019, 21:42:00 UTC
Да, в синтаксисе ошибся. Пробелы можно порезать прямо в условии цикла:
for line in $(cat somefile.txt | sed "s/\s*//g"). Правда, я не очень понимаю, чем может быть полезна переменная, содержащая строку из файла, если мы её уже покорёжили.
Тогда уж
for n in $(seq 1 $(cat somefile.txt | wc -l)); do
line=$(cat somefile.txt | sed -n ${n}p);
blablabla;
done;

Reply

klink0v September 27 2019, 10:31:59 UTC
Спасибо за полезный коммент.

На самом деле можно просто в конце каждой строки файла somefile.txt добавить какой-нибудь символ (например, ";") и запускать цикл с предварительной установкой IFS=";" . Так работает, проверил. То есть

export IFS=";"
for line in $(cat somefile.txt) ; do бла-бла-бла

Возьму на вооружение.

На самом деле мне просто порвало шаблон тем, что в таком режиме jenkins-cli по идее не должен ничего читать со STDIN, а всё равно читает. Вот я и затупил конкретно. Что ж, теперь буду умнее.

Reply


donz_ru September 26 2019, 19:49:35 UTC
Ты за один плохо написанный код перевешиваешь все претензии на язык программирования, которым какой-то мудак написал этот код? Что-то мы вроде этого проходили несколько десятилетий назад...

Reply


Leave a comment

Up