и снова bash, разница между for и while

Я, кстати, грабли огребал на парсинге почтового ящика. Там было ~ 600 000 файлов (спам за 5 лет в основном :)), а индекс к этой помойке был похерен :)
Так вот ls отрабатывал этак с полчаса.
for тоже стартовал далеко не сразу, а в некоторых каталогах вылетал с переполнением.
Решением стало find … -exec …
find не формирует список и не сортирует его по алфавиту, работает “с колёс”.
А как пишут в учебниках в цикле for истинность выражения используется для выхода, а в цикле while - для продолжения.
newbie0611
Я, кстати, грабли огребал на парсинге почтового ящика. Там было ~ 600 000 файлов (спам за 5 лет в основном :)), а индекс к этой помойке был похерен :)
Так вот ls отрабатывал этак с полчаса.
for тоже стартовал далеко не сразу, а в некоторых каталогах вылетал с переполнением.
Решением стало find … -exec …
find не формирует список и не сортирует его по алфавиту, работает “с колёс”.
А как пишут в учебниках в цикле for истинность выражения используется для выхода, а в цикле while - для продолжения.

возможно это какая то особенность ffmpeg -

вот такая конструкция переходит по именам, при этом не корректно работает ffmpeg (на выходе файлы нулевой длины) и скрипт висит ожидая окончания ввода (тоесть while read работает как задуманно)

ls -1 *.flv | while read j; do ffmpeg -t 10 -i “$j” -s svga -y “${j%.*}.mp4” 2&1> /dev/null; done

$ ls -lh
+ ls -lh
total 52M
-rw-r–r– 1 user users 0 Oct 11 17:30 -
-rw-r–r– 1 user users 179K Oct 11 16:40 5DF77StYwVU.flv
-rw-r–r– 1 user users 136K Oct 11 17:15 5DF77StYwVU.flv.tar.gz
-rw-r–r– 1 user users 0 Oct 11 18:06 5DF77StYwVU.mp4
-rw-r–r– 1 user users 26M Aug 30 2010 c4x1RPoMoAg.flv
-rw-r–r– 1 user users 26M Oct 11 17:15 c4x1RPoMoAg.flv.tar.gz
-rw-r–r– 1 user users 0 Oct 11 18:06 c4x1RPoMoAg.mp4
2&1> /dev/null
Это ошибка. Программе передаётся агрумент "2", и она отправляется в бэкграунд & , после чего делается попытка выполнить команду "1", которой естественно не существует.

На самом деле перенаправление stderr в stdout делается так: 2>&1 , то есть дескриптор "2" перенаправляется в дескриптор >& номер "1"
Полная завпись перенаправления stderr в stdout, а потом всёго в /dev/null выглядит так: 2>&1 > /dev/null
А ещё для такого случая есть сокращённая: &> /dev/null

Кстати, перенаправление тут не поможет – в варианте ls | while read … оболочка делает форк, то есть текущий процесс выполняет команду ls , вывод которой перенаправляется в “трубу”, из которой читает свой стандартный ввод уже другой процесс оболочки, который реализует while и read, и который запускает уже третий процесс, то есть ffmpeg, вывод которого вы зачем-то перенаправляете.

Если ffmpeg и передаёт что-то родительскому процессу с циклом, то это не вывод, а сигнал.
Natrio
На самом деле перенаправление stderr в stdin делается так: 2>&1 , то есть дескриптор "2" перенаправляется в дескриптор >& номер "1"
Полная завпись перенаправления stderr в stdin, а потом всёго в /dev/null выглядит так: 2>&1 > /dev/null
А ещё для такого случая есть сокращённая: &> /dev/null
s/stdin/stdout/
Есть предложение модераторам перенести ветку в /dev/null и переобозвать в “увлекательное погружение в мир коллективного bash”
void, спасибо, исправил.

newbie0611, нет. Знание шелла вообще, и bash в частности, крайне желательно в Линуксе, и тем более в Арче.
Natrio
2&1> /dev/null
Это ошибка. Программе передаётся агрумент "2", и она отправляется в бэкграунд & , после чего делается попытка выполнить команду "1", которой естественно не существует.

На самом деле перенаправление stderr в stdout делается так: 2>&1 , то есть дескриптор "2" перенаправляется в дескриптор >& номер "1"
Полная завпись перенаправления stderr в stdout, а потом всёго в /dev/null выглядит так: 2>&1 > /dev/null
А ещё для такого случая есть сокращённая: &> /dev/null

Кстати, перенаправление тут не поможет – в варианте ls | while read … оболочка делает форк, то есть текущий процесс выполняет команду ls , вывод которой перенаправляется в “трубу”, из которой читает свой стандартный ввод уже другой процесс оболочки, который реализует while и read, и который запускает уже третий процесс, то есть ffmpeg, вывод которого вы зачем-то перенаправляете.

Если ffmpeg и передаёт что-то родительскому процессу с циклом, то это не вывод, а сигнал.

конструкция 2&1> /dev/null - банальная опечатка, я чего то там хотел проверить и сделал фигню )
сигнал ffmpeg при выходе (проверял добавляя в “тело” цикла && echo $? - правильно определаю сигнал который возвращает ffmpeg?) возращает 0 как и tar
но конструкция с ls | while| tar отрабатывает, а ffmpeg нет )
Нет, это не сигнал. То что вы проверяли – это код завершения.
Сигналы это системные события UNIX. Для их отправки “вручную” используется команда kill , например
kill -TERM 13567
отправляет сигнал SIGTERM процессу с PID=13567, который в результате завершается. Есть и другие сигналы (подробнее читайте маны, вики и статьи о сигналах в UNIX/Linux), и в частности, некоторые из них посылаются родительским процессам при завершении дочерних.
2 Natrio
Я как раз не спорю, что шелл знать надо. Только тут мы уже достаточно далеко ушли от первоначально заданного вопроса. Как я понимаю, эта ветка предполагается как подспорье новичку, который чего-то не смог вкурить из вики/мануалов.
А флейм, который разрастается сейчас - ему самое место в /dev/null (я так понимаю, беседы о шелле являются подмножеством бесед обо всём). Но тема очень интересная.
newbie0611, МЫ никуда не ушли от первоначально заданного вопроса, никакого флэйма (бессмысленных и беспощадных споров до драки, с закидыванием оппонента чем попало) тут тоже нет :)
Всё строго по существу, как темы, так и подфорума, баш для начинающих.
Вы обращались к модераторам – модератор вам ответил.
 
Зарегистрироваться или войдите чтобы оставить сообщение.