LINUX.ORG.RU

есть ли лень в bash?

 ,


1

1

что нибудь такое можно сделать, command1 | exit_if_condition_is_true | command2, чтобы command2 и остаток вычислений сбросились, и убился весь пайп(все процессы порожденные им), по какому-нибудь условию, где-то в середине потока строк, если текущая строка совпадет с условием?

Как написать такой скрипт, который в качестве аргументов принимает команды, я приблизительно представляю, вероятно, надо просто вызвать изнутри killall по именам аргументов. А вот интересно, можно ли сделать такое интерактивно.



Последнее исправление: portquest2016 (всего исправлений: 5)

Ответ на: комментарий от shell-script

допустим на вход exit_if_condition_is_true идет foo bar baz а условие (песвдокод)if string == bar -> return, в этом случае, все процессы должны прерваться

portquest2016
() автор топика
local _rt=""
while :; do
  [ -n ${_rt} ] && kill -TERM $(basename ${0})
  some
  code
  return
done | {
  sed | \
  grep "whatyouneed" && _rt="ololo";
}

Естественно, нужно разбивать выхлоп цикла на строки, иначе у тебя отрубит цикл только после полного прохода, но это ты сам разберёшься.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 1)

Так?

echo -e "foo\nbar\nbaz" | while read line; do if [ "bar" = "$line" ];then exit; else echo "$line"; fi; done | cat
surefire ★★★
()
Ответ на: комментарий от doushiyou

SIGPIPE

и на этом спасибо
хотя хотелось бы чтобы у пайпа ещё был буфер и команда-продюсер блокировалась, пока не готова команда-консумер, ну как в go и во всех нормальных языках
и походу в баше этого нет. Но как можно было об этом не подумать при проектировании? unix делали какие-то неучи, тяп-ляп и готово(при том что unix-way тексто-пайпо ориентированность и т.д.).

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Ты, кажется, виртуал anonimous’а (он же ТС) — ничего не знаешь, в голове — каша, но кого-то покритиковать хочется.

http://man7.org/linux/man-pages/man7/pipe.7.html

Pipe capacity
pipe has a limited capacity. If the pipe is full, then a write(2) will block or fail, depending on whether the O_NONBLOCK flag is set (see below).

doushiyou
()
Ответ на: комментарий от shell-script

Так мой код выше написан с оглядкой использования внутри функции скрипта. Единоразово такие пайпы городить не вижу смысла.

r3lgar ★★★★★
()
Ответ на: комментарий от Bad_ptr

Ленивость это вообще о другом.

Ленивость - это когда у тебя несколько условий, а вычисление условия делает n бессмысленным вычисление последующих, то последующие не вычисляются.

Например условие a && b, при a = false, уже не важно какое будет b, от него не зависит общий результат. Это не так важно, когда мы обрабатываем переменные с готовым результатом, но важно, если вместо переменных функции выполняющие вычисления или действия.

surefire ★★★
()
Ответ на: комментарий от surefire

нет, это когда у тебя есть «генератор», внутри которого происходят вычисления, и потребитель, который вычесленные значения использует. Когда ленивость есть, то генератор произведёт столько вычислений, сколько его попросит потребитель, когда ленивости нет — генератор произведёт сразу все вычисления, не важно сколько из них потом реально понадобятся потребителю, и только потом потребитель начнёт 'поглащать' необходимое количество значений, произведённых генератором.

Bad_ptr ★★★★★
()
Ответ на: комментарий от shell-script

Но, согласись, что в скрипте городить exit тоже не надо где не надо. Так что тут у ТС задача немного недсказана или недопонята (самим ТС).

Да и вообще, городить такой сложный пайп для одного раза — это оверхед, проще глазами пробежаться, или воспользоваться поиском, встроенным в эмулятор терминала. ТС, это я тебе говорю.

r3lgar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.