Есть ли код sh, который не является синтаксически допустимым кодом bash (не будет ругаться на синтаксис)?

Я думаю перезаписать sh на bash для определенных команд.

31
Anthony Geoghegan 11 Май 2018 в 13:07
1
Я предполагаю, что под действительным я имел в виду синтаксически действительный, поэтому он не будет блевать по синтаксису
 – 
Alexander Mills
11 Май 2018 в 09:01
2
Разная токенизация? например (( приходит на ум.
 – 
ccorn
11 Май 2018 в 19:00
1
Для некоторых дистрибутивов /usr/bin/sh — это просто символическая ссылка на /usr/bin/bash (я использую CentOS 7.3, и это так). Вы должны проверить, действительно ли sh является bash для вашего дистрибутива.
 – 
Centimane
11 Май 2018 в 19:41
1
Несколько лет назад весь мой проект сломался, когда что-то «обновили» в bash. Мне пришлось изменить все мои строки shebang с #!/bin/sh на #!/bin/bash. Затем все снова заработало, поэтому вам действительно нужно быть осторожным. Возможно, это произошло, когда они начали использовать тире вместо bash для sh.
 – 
Joe
12 Май 2018 в 02:43
1
@ Джо, это противоположно тому, о чем просит ОП - у вас был код bash, который был ошибочно помечен как код sh, но таковым не был. ОП спрашивает, может ли у них быть (фактический, а не неправильно помеченный) код sh, который ломается, когда он работает с bash, а не может ли он иметь код bash, который ломается, когда он работает с sh (что очевидно - - если бы расширения bash не влияли на доступные функции языка, они не были бы расширениями).
 – 
Charles Duffy
12 Май 2018 в 23:01

2 ответа

Вот код, который делает что-то другое в POSIX sh и Bash:

hello &> world

Является ли это "недействительным" для вас, я не знаю.

В Bash он перенаправляет как стандартные вывод и стандартная ошибка из hello в файл world. В POSIX sh он запускает hello в фоновом режиме, а затем выполняет пустое перенаправление в world, усекая его (т. е. обрабатывается как & >).

Есть много других случаев, когда расширения Bash будут делать свое дело при запуске под bash и будут иметь другие эффекты в чистом POSIX sh. Например, расширение фигурных скобок — еще одно, и оно тоже работает одинаково в режиме POSIX Bash и нет.


Что касается статических синтаксических ошибок, Bash имеет оба зарезервированных слова (например, [[ и time), не указанные в POSIX, так что [[ x является допустимым кодом оболочки POSIX, но синтаксической ошибкой Bash, и историю различных ошибок несовместимости с POSIX. это может привести к синтаксическим ошибкам, например, из этого вопроса:

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

Только синтаксические ошибки — довольно опасное определение «недействительного» для любых обстоятельств, где это имеет значение, но так оно и есть.

48
Michael Homer 12 Май 2018 в 02:19
3
Обратите внимание, что, хотя в настоящее время раскрытие фигурных скобок делает bash (и zsh, pdksh, ksh93) несовместимыми, POSIX работает над добавлением в спецификацию положения, разрешающего раскрытие фигурных скобок{fd}>file аналогичная проблема), чтобы bash снова мог быть совместимым (расширение фигурных скобок останется неопределенным, но совместимые сценарии должны будут выполнять echo "{a,b}" — они хотят, чтобы выводилось {a,b}). См. обсуждение, с которого все началось
 – 
Stéphane Chazelas
11 Май 2018 в 11:39
2
Также относится к этому вопросу и ответу: austingroupbugs.net/view.php?id=1191#c3983< /а>
 – 
Stéphane Chazelas
11 Май 2018 в 11:40
2
Будет ли кто-нибудь, пишущий сценарий на POSIX, написать такую ​​команду? ОП переходит от sh к bash, и, насколько я понимаю, кажется, что проблема в другом направлении?
 – 
Rich
11 Май 2018 в 18:10
1
@Rich: Конечно. Я не использую никакие системы, в которых /bin/sh является bash, поэтому, если бы я активно не знал об этом башизме, при написании командной строки это могло бы легко произойти. Интервал в ответе делает его маловероятным, но hello&>world менее надуманным.
 – 
R.. GitHub STOP HELPING ICE
11 Май 2018 в 18:21
2
 – 
Gordon Davisson
13 Май 2018 в 11:12

Краткий пример:

time()(:)

time в Bash является зарезервированным словом и ведет себя иначе, чем программа time. Вполне вероятно, что вы сломаете некоторые практические сценарии, пытаясь проанализировать результат time с помощью bash. Но технически это не синтаксическая ошибка. Переопределение time как функции будет редким, но вызовет синтаксическую ошибку, как указано в этом вопросе.

Более короткий пример:

a():

Действителен в dash, но не совместим с POSIX.

16
user23013 11 Май 2018 в 19:28
3
В более общем смысле любое слово, являющееся нестандартным ключевым словом или встроенной командой в Bash, вызовет тот же эффект. В дополнение к time есть такие вещи, как declare, function, select и coproc. Хотя некоторые из них явно отмечены в стандарте как неуказанные (ключевые слова и встроенные модули/утилиты), но я не могу см. например time или coproc в списке. И использование --posix, похоже, не помогает.
 – 
ilkkachu
11 Май 2018 в 19:05