Потерял почти целый рабочий день на одном странном затыке.
Задача. У нас есть обычный текстовый файл, в нем N строчек. Нужно запустить некоторое приложение также N раз, передав ему в качестве параметра очередную строчку из упомянутого файла. Казалось бы, что может быть проще?
#!/bin/bash
(
Read more... )
Comments 23
=:))
Reply
Я давным-давно сформулировал правило "если софт написан на Jave, то скорее всего это - полное говно". Из исключений пока только Vuze
Reply
Reply
Reply
Reply
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell
То есть, если запускаемый хочет STDIN, он таки его получит не из /dev/null, а таки из того, кто был родителем на время старта.
Reply
Reply
Нормальный grep или там sed будет брать параметры из cli, и только если их нет. займётся STDIN.
Но это же для сторонних утилит, скажем мягко, не совсем так. О чём думал автор, обычно загадка.
Поэтому, да, если сам держишь в скрипте STDIN, приходится заботиться о том, чтобы не отдать его кому-нибудь ненароком после fork.
Я последнее время даже trap не ленюсь писать в shell :)
Reply
Reply
Если не хочется приколов с stdin, то лучше сделать
for $(cat somefile.txt); do bla-bla-bla; done;
Вообще, всё, что связано с потоками ввода-вывода в шелле, достаточно запутанно для того, чтобы регулярно выстреливать себе в ногу. Вроде бы концепция простая. но вечно натыкаешься на какой-нибудь побочный эффект. Ну их.
Reply
Только вот не уверен что в моём случае так сработает. Потому что у меня строки файла содержат пробелы. Теоретически, можно заранее по нему пройтись sed-ом и всё заэкранировать, конечно...
Reply
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
На самом деле можно просто в конце каждой строки файла somefile.txt добавить какой-нибудь символ (например, ";") и запускать цикл с предварительной установкой IFS=";" . Так работает, проверил. То есть
export IFS=";"
for line in $(cat somefile.txt) ; do бла-бла-бла
Возьму на вооружение.
На самом деле мне просто порвало шаблон тем, что в таком режиме jenkins-cli по идее не должен ничего читать со STDIN, а всё равно читает. Вот я и затупил конкретно. Что ж, теперь буду умнее.
Reply
Reply
Leave a comment