LINUX.ORG.RU

Ещё один вопрос по bash

 


0

1

Скажите, пожалуйста, знающие люди, есть ли возможность сделать вместо этого:

grep $exp ~/tmp/file_orig > ~/tmp/file
while read line;do
      echo $line
done < ~/tmp/file

что-то наподобие такой ереси:

while read line;do
      echo $line
done < `grep $exp ~/tmp/file_orig`
?

Я имею в виду как-то оперировать с многострочным выводом команды без предварительной записи этого вывода во временный файл (grep здесь взят чисто для примера).

Внятный гуглозапрос на эту тему сформулировать не смог)

Спасибо за внимание.

★★★★★

можно, вместо «<» используй «<<<»
для переменных аналогично
да, про двойные кавычки не забудь, иначе отвалится много сторочность

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

Так он память сожрет на весь вывод грепа (и обрабатывать можно только после того, как греп полностью сработает).

grep ...| while ... человечнее.

LeninGad
()
Ответ на: комментарий от megabaks

Я вообще ни при чём, я мимокрокодил, у меня чаще всего выхлоп в такой ситуации не кончается вообще (то есть небольшой, но EOF не дождёшься, типа netcat ... | grep ...).

Просто интересно, видишь ли ты у своего решения какое-нибудь достоинство, которое компенсировало бы его недостатки (а вдруг?).

LeninGad
()

Если нужно в том же контексте (чтобы переменные были видны после блока) - то башизмы:

set -o lastpipe / done < <(...)

. Ну и раз bash - то "read -r".
anonymous
()
Ответ на: комментарий от LeninGad

код читабельней
да и с переменными проще через <<< чем овер echo $var |

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

Ну как сказать. А если работать с выхлопом curl (для чего, собственно, вопрос и задавался, если честно говорить)?

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

ты хоть представляешь сколько текста надо хотя бы на метр?
потому если вывод не может зависнуть на вечно, то проще так.
а там смотри сам.
каждый дрочит как хочет.
тем более ты спрашивал про перенаправление - об этом я написал. а уж что конкретно использовать в конкретном случае, перенаправление или пайп - это уже совсем другая история, не!?

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

а, ну да) я на пробу качнул хтмл-ку, чтоб заценить, и метры с килограммами перепутал, как дитя)))

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

«стесняясь своего невежества»

«для переменных аналогично» - это для ( 'первое слово' 'второе слово' 'и так далее' )?

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

эм... давай так, на примерах: переменная

x="1
2
3"
тогда такой код
while read line;do echo "${line}";done <<< "${x}"
выдаст
1
2
3
вот такой
while read line;do echo "${line}";done <<< ${x}
выдаст
1 2 3
если же переменная
x="1 2 3
a b c"
то вот такой код
while read w y z;do echo "${w}" "${y}" "${z}";done <<< "${x}"
выдаст
1 2 3
a b c
а такой
while read w y z;do echo "${w}" "${y}" "${z}";done <<< ${x}
1 2 3 a b c

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

перенаправление выхлопа функций и переменных
аналогично < file

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

Твой код лучше. Вариант с «| while» от cx при трёхуровневом парсинге вконтактной стенки породил трудноописуемый необъяснимый глюк. При переделке цикла по твоему методу глюк исчез.

piyavking ★★★★★
() автор топика

В rc можно так:

{
    while(l=`{read}) echo $l
} < <{grep $exp $home/tmp/file_orig}
Вроде бы есть какой-то башизм, который делает нечто подобное <{}.

Если тебе не подходит прямой ввод/вывод, можешь сделать <{echo -n `{grep $exp $home/tmp/file_orig}}

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

Вроде бы есть какой-то башизм

Ещё один вопрос по bash (комментарий)

Ну и кидаться «башизмом» - громковато в контексте rc, одно дело posix shell, другое плановская поделка. Или на нее уже есть стандарт?

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

posix shell
bash

Лол. Смотри http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
Bash с одной стороны слишком ушёл (пусть и обратно совместим) от posix shell, чтобы называться стандартом, и слишком раздут и неудобен, чтобы иметь смысл там, где стандарты не нужны.

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

Лол. Смотри

Сам ты лол. Сначала думай, потом пиши. Перечитай ветку. Никто про «стандарт» относительно баша не говорит. Еще раз: с позиции posix shell еще можно говорить «башизм», а с позиции rc - уже нет. Тогда про _весь твой код_ можно сказать rc-изм, доступно?

// учитывая, что изначальный тег был баш, склонен понимать «башизм» - как _непортабельная_ фича

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