Я знаю об относительной приоритетности операторов ';', '&', '&&' или '||'
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). Есть и другие ситуации, поэтому не начинайте давать мне советы, в которых используются отдельные утверждения или специальные опции, характерные для этих программ. Я хочу понять обязательный приоритет.
источник
{
...}
должно работать. Я мог бы попробовать это бессистемно и не получил ожидаемых результатов.Ответы:
Краткий ответ таков
<
,>
и их варианты имеют наивысший приоритет связывания (самое жесткое связывание), за которым следует|
, а затем&&
и||
, а затем;
и&
. Таким образом, только поecho "Thumbnail creation failed"
трубопроводуtee
.Несколько более длинный ответ указывает на то, что на самом деле наивысший приоритет имеет группировка, которая может быть указана в скобках или фигурных скобках. Например,
а также
примерно эквивалентны
Ноты:
B
иC
выполняются в дочернем процессе. Поэтому такие команды, как присвоение переменных, неcd
будут влиять на родительскую оболочку. Команды в фигурных скобках выполняются в том же процессе, что иA
команда. Следовательно, конструкция скобкиA && { B; C;}
ближе кif
-then
-else
конструкции.{
и a;
(или a&
, или перевод строки) перед}
.Подробнее читайте в разделе Что такое операторы управления и перенаправления оболочки? и когда «если» не нужно? (особенно мои ответы).
Для получения дополнительной информации см. Справочную страницу bash (1) и спецификацию / определение POSIX языка команд оболочки , в частности раздел 2.9, Команды оболочки и раздел 2.10.2, Правила грамматики оболочки . Это попытка предоставить некоторый контекст для вышеупомянутого:
Вещи как
myVar=42
IFS= read a
date
cd /some/directory
ls -laR dir1 dir2
cat foo* > /tmp/allfoo
ls -laR dir{1,2}
find . -type f -name "foo*" -print > /tmp/output 2> /dev/null
> newfile
[ -f catfood ]
exit
все считаются «простыми командами».
x=1 | od -ab
илиls -laR | z=0
синтаксически допустимы.называются «списки» bash и «И-ИЛИ списки» POSIX. Опять же, отдельный «конвейер» или даже отдельная «простая команда» считается «списком И-ИЛИ», даже если он не содержит И или ИЛИ.
номенклатура начинает становиться немного противоречивой. Баш также называет эти «списки»; POSIX называет их «списки», «составные списки» и (редко) «термины». Опять же, отдельный список «И-ИЛИ», «конвейер» или даже отдельная «простая команда» считается «списком», даже если он не содержит a
&
или a;
.а также
и команды управления потоком (
for
,if
-then
-else
,while
и т. д.) называются «составными командами».В приведенных выше примерах, вероятно , имеет самый смысл интерпретировать
A
,B
иC
быть трубопроводов. Помните, что «конвейер» может быть отдельной «простой командой»; это не должно содержать трубу.источник
(
..)
и{
..}
. Из предыдущего неудачного опыта я пришел к выводу, что круглые скобки используются только в контексте «динамических команд» (т.$(
Е.)
), Так как я едва мог заставить их делать что-либо в отношении ассоциативности.