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

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

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 & ) перед } .

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

  • Труба не поднимает stdout
  • Запросы на поиск труб в vim или менее
  • Убивать другие процессы в трубопроводе (программно)
  • Почему вход в канал хорошо подходит для zenity, но <файловые неполадки?
  • Заменить номер CD в теге MP3 ID3
  • Как удалить первые n строк и последнюю строку файла с помощью команд оболочки?
  • Почему этот сценарий не работает?
  • Как вывести выход из кошки
  • кто может получить подсчет «базового subDir», не имея subDirs?
  • Как я могу выполнить вывод tar через mv?
  • Не удалось сохранить значение в канале
  • Linux и Unix - лучшая ОС в мире.