LINUX.ORG.RU

Что означают круглые скобки в shell

 , ,


0

2

Столкнулся со странным поведением скрипта в тех случаях, когда я пишу примерно так:

[ $? = 0 ] && (echo -e "OK!"; chmod +x "$target_file") || echo "FAILED"

Можно ли так использовать круглые скобки и если нет то почему?



Последнее исправление: id_thx1138 (всего исправлений: 1)

Круглые скобки - запуск подпроцесса (отдельного процесса bash) и выполнение кода в нём:

$ echo $BASHPID; ( echo $BASHPID; )
13427
13279

В принципе Ваш код должен работать правильно, если не считать того, что так делать нерационально.

P.S. Проблемы будут, если попытаетесь изменить какие-то переменные из основной программы внутри порождённого процесса: естественно, в основном процессе они и не подумают изменяться.

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

О... в этом то и проблема как раз! Спасибо, я понял свою ошибку. То есть какого-то короткого способа записи

if []; then
else
fi
нет?

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

Способ есть, но скобки тебе в этом не помогут. Дай конкретный контекст.

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

То есть какого-то короткого способа записи

в общем случае нет

можно попробовать «echo ...» поставить раньше - оно реже отваливается, но тоже может: «exec >&-; echo stdout && echo stderr >&2»

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

«[[» - это нативный оператор сравнения BASH, который быстрее и функциональнее прочих и неплохо заменяет даже "((" (для алгебраических сравнений).

[[ $x > $y ]]
[[ $x =~ ^foo(bar)?$ ]] && \
  echo ${BASH_REMATCH[1]}
[[ $x && ($y || $z) ]]

etc.

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

В вашем случае ругается... на код

PRINT="Print1"
[[ "$1" ]] && { echo "true"; PRINT="Print true"; } || { echo "false"; PRINT="Print false" }
echo "$PRINT"
ругается:
$ ./test 0
./test: 5: ./test: Syntax error: end of file unexpected (expecting "}")

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

Прочитав последнее сообщение понял что у вас bash... просто у меня shell т.к. на arm-девайсе, для которого предназначаются скрипты есть только sh.

И я забыл ; исправил, да в таком виде работает, спасибо

#!/bin/sh
PRINT="Print1"
[ $1 != 0 ] && { echo "true"; PRINT="Print true"; } || { echo "false"; PRINT="Print false"; }
echo "$PRINT"

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

Так, а в чем прикол? у меня одинаково с круглыми и фигурными исполняется, только с круглыми процесс создается еще.

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

тоже может: exec >&-;

Блин, как это сделать теперь обратно?

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

«[[» - это нативный оператор сравнения BASH, который быстрее и функциональнее прочих

непереносим, относится к т.н. башизмам и за его использование в приличном обществе бъют по лицу.

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

Есть один нюанс, когда условие true, а code_if_true завершится с отличным от нуля статусом, то выполнится code_if_false.

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

непереносим, относится к т.н. башизмам и за его использование в приличном обществе бъют по лицу.

Да какая разница? Ведь bash/shell в приличном обществе и не используют.

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

относится к т.н. башизмам и за его использование в приличном обществе бъют по лицу.

Ну и общество у вас.

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

И ещё, в догонку.

непереносим

Всё хочу спросить, куда вы их все, блядь, переносить собираетесь? В Стиме продавать? Шелловские скрипты пишутся в 99.999999% случаев для конкретной системы, а то и машины.

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

С каких пор сборище идиотов стало называться «приличным обществом»?

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

BASH есть под все известные мне платформы, я на AIX написал башевого кода не так уж и мало. Если говорить о дефолте, то он вообще чуть ли не в каждом никсе свой, и это чаще не sh, чем sh. А главное, у ТС по-любому sh, так что какая разница?

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

BASH есть под все известные мне платформы

Зато установлен по умолчанию далеко не на всех.

Если говорить о дефолте, то он вообще чуть ли не в каждом никсе свой

А это не важно. Важно что это POSIX совместимый шелл, на котором башизмы работать не обязаны.

А главное, у ТС по-любому sh

Именно что sh, а не bash. А вы вводите человека в заблуждение, расписывая преимущества непереносимой конструкции, и забыв упомянуть что она, собственно, непереносима.

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

расписывая преимущества непереносимой конструкции, и забыв упомянуть что она, собственно, непереносима.

Куда переносим-то и зачем? Можно реальные, не фантастические, массовые переносы продемонстрировать? И чттоб «башизмы» помешали.

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

И чттоб «башизмы» помешали.

Ну попробуй, запусти /bin/sh скрипт со своими [[ на дебиане. Там /bin/sh это, на минуту, dash. А скрипт с /bin/bash запусти на FreeBSD. Там его никогда по этому пути не будет.

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

Есть прекрасная утилита env. А во FreeBSD ещё в 2009-м году был сплошной уродский csh, в котором были абсолютно чудовищные сишизмы. И что? сиш был тогда хорош, потому что BSD?

BASH - самая распространённая командная оболочка для Linux, Linux - самая распространённая *nix-система. bash есть даже для android и ставится элементарно. И да, если на то пошло, тот же python тоже по дефолту есть далеко не везде, а в Debian не только dash, но ещё и некий IceWeasel (потому что Debian, и этим всё сказано). При этом в Debian всё-таки есть, внезапно, /bin/bash.

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

И что? сиш был тогда хорош, потому что BSD?

были абсолютно чудовищные сишизмы

Про которые все были в курсе и всем не навязывали.

сиш был тогда хорош, потому что BSD?

Во времена оные, оригинальный bourne shell был ну совсем уж restricted. Вот взять dash, выкинуть от туда ${var#$%/} синтаксис и прочие >&- получим времена csh и того родителя bash.

BASH - самая распространённая командная оболочка для Linux,

Проблема как обычно в том, что тот же синтаксис [[ имеет несовместимости с 2-3-4 версиями bash. Я нарывался и было весьма неприятно. Оно и понятно, когда имеем типичный линусковый подход: сейчас мы по быстрому сделаем модно-молодёжно и круто наперекор вашим старческим догмам, а потом оказывается, что имеются противоречия в синтаксисе.

Но это не важно. Самое смешное в этом топике в том, что теперь можно-молодёжно ни за что не юзать if/then/else! Такое чувству, что мир сошёл с ума.

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

Про которые все были в курсе и всем не навязывали.

Ну, наконец-то баш сравнили с системди. Аплодирую стоя.

синтаксис [[ имеет несовместимости с 2-3-4 версиями bash.

Да, как и в любом другом языке. Вы, уважаемый, на k&r C до сих пор пишете?

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

удобство, я так понимаю, в принципе не рассматривается? и кто тут религиозен после этого

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

Да, как и в любом другом языке. Вы, уважаемый, на k&r C до сих пор пишете?

Вы не поверите, но я даже иногда использую синтаксис cmd_if && { cmd1; cmd2 }. Хотя изначально синтаксис с одельностоящими фигурными скобками придуман был для группировки команд с едиными файловыми перенаправлениями. Но оказалось, что для очень коротких комманд, типа { echo Ok; exit 0} вполне сойдёт и для && / || синтаксиса. Но нет же, по молодёжному инфантильно-нигилистическому ясен пень надо обязательно выдирать гланды через задний проход, и кто так не делает, тот старопердун. Смешно и грустно.

В качестве домашнего задания можете попытаться понять, почему в dash до сих пор нет синтаксиса «подстрока» - ${par:offs:len}, подсказка - где там противоречия в синтаксисе у bash.

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

например, когда пишешь configure.ac или автотулзовские M4 макросы, весьма желательна переносимость

А ещё есть Makefile, который вообще не на шелле. Кто-то призывает их писать на баше? Я же не зря оставил 0.000001%. И это повод отказываться от возможностей новых версий языка?

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

В качестве домашнего задания

Смахнул слезу со щетины.

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

Расскажи нахера эти [[ нужны? Кроме поиска приключений на свою жопэ.

anonymous
()

Удивительно, какое противостояние вызвал, казалось бы, безобидный топик) bash я ни использовать, ни поставить не могу, поскольку ОС под arm-девайс поставляется мне «as is», в виде образа, который накатываешь через U-Boot, какие-то недостающие мне утилиты я могу взять из Buildroot, но в целом там все весьма скупо...

Честно говоря, я не думаю, что такая ситуация редка, многие проприетаарные решения могут работать десятилетиями просто потому что работает. Мне вот сейчас выдали обновление с 4.9, так вот, то nand отваливается, то kernel panic...

И я уже пару раз нарвался на то, что видя прикольный скрипт, обламывался потому что он работает на bash-е, хотя на гите в описании пишут «shell-script for...», ну написали бы «bash-script for...» я бы даже время на него тратить не стал бы! Многие почему-то проводят знак равенства между ними, наверное это следствие того, что многие работают в полных неурезанных системах.

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

Многие почему-то проводят знак равенства между ними

что с утят взять. правда, ашотик?

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