Перенос связывания труб и перенаправления с дизъюнктами, конъюнктами и т. Д.?

Я знаю относительный приоритет привязки операторов ';', '&', '&&' или '||'

http://www.gnu.org/software/bash/manual/bashref.html#Lists

но когда трубы попадают в картину вместе с «&&», я пытаюсь понять силу привязки и либо наткнуться на правильную команду, либо просто сдаться.

Каков приоритет привязки '|' и '>' по сравнению с приведенным выше?

Пример, где я запутался:

ls _thumbnails/video.mp4.jpg 2>/dev/null && echo "thumbnail already generated. Not regenerating" \ && exit \ || ffmpeg_thumbnail_create video.mp4 2>/dev/null \ && ls _thumbnails/video.mp4.jpg \ && echo "Thumbnail successfully created" \ && exit \ || echo "Thumbnail creation failed" \ | tee ~/thumbnails.log 

Цель вышеизложенного – создать миниатюру, если и только если ее еще нет (я запускаю ежедневный cronjob). И мне не нравится огромный объем вывода ffmpeg, когда нет ошибки (что не является способом Unix). Есть и другие ситуации, поэтому не начинайте давать мне советы, в которых используются отдельные заявления или специальные параметры, специфичные для этих программ. Я хочу понять приоритет привязки.

One Solution collect form web for “Перенос связывания труб и перенаправления с дизъюнктами, конъюнктами и т. Д.?”

Короткий ответ заключается в том, что < , > , и их варианты имеют наивысший приоритет привязки (самая строгая привязка), за которой следуют | , а затем && и || , затем ; и & . Таким образом, только echo "Thumbnail creation failed" транслируется в tee .

Несколько более длинный ответ указывает, что наивысший приоритет – это фактически группировка, которая может быть обозначена скобками или фигурными скобками. Например,

 A && (B; C) 

а также

 A && { B; C;} 

приблизительно эквивалентны

 if A then B C fi 

Заметки:

  • Скобки дают вам подоболочку; т.е. команды B и C выполняются в дочернем процессе. Поэтому команды, такие как присвоения переменных или cd будут влиять на родительскую оболочку. Команды в фигурных скобках выполняются в том же процессе, что и команда A Поэтому конструкция скобки A && { B; C;} A && { B; C;} ближе к конструкции if then else .
  • В синтаксисе привязки должно быть пробел после { и a ; (или a & ) перед } .

Дополнительные сведения см. В разделе Что представляют собой операторы управления и перенаправления оболочки? и Когда «если» не нужно? (в частности, мои ответы).

  • Проблемы с find, xargs и egrep
  • Можете ли вы scp, sftp или rsync, трубу?
  • Может ли сращиваться () / tee () работать с сокетами, а не только с трубами?
  • Перенаправление stdin с stdout в файл
  • Использование файлов, имеющих пробелы в их имени в трубах
  • Небуферизованная команда socat для подключения последовательных портов на удаленных компьютерах и регистрации данных
  • Неблокированный опрос от двух труб?
  • Извлечь сжатый файл по его заголовку, поскольку он передается по каналу из stdout (локально или из удаленного места)?
  • Поведение stdin / stdout в сочетании с подоболочками и командой cd
  • / proc / PID / fd / X номер ссылки
  • Стандартный / канонический способ проверить, выводит ли предыдущий трубопровод выпуск?
  • Linux и Unix - лучшая ОС в мире.