Есть ли какой-нибудь sh
код, который не является синтаксически допустимым кодом bash (не будет ли нарушаться синтаксис)?
Я думаю о перезаписи sh
с bash
определенными командами.
bash
shell-script
posix
Александр Миллс
источник
источник
((
приходит на ум./usr/bin/sh
это просто символическая ссылка на/usr/bin/bash
(я использую CentOS 7.3, и это так). Вы должны проверить,sh
действительно ли этоbash
для вашего дистрибутива.#!/bin/sh
на#!/bin/bash
. Затем все снова заработало, так что вам действительно нужно быть осторожным. Это могло произойти, когда они начали использовать тире вместо bash для sh.Ответы:
Вот код, который делает что-то другое в POSIX sh и Bash:
Является ли это "недействительным" для вас, я не знаю.
В Bash он перенаправляет как стандартный вывод, так и стандартную ошибку из
hello
файлаworld
. В POSIXsh
он работаетhello
в фоновом режиме, а затем выполняет пустое перенаправление в негоworld
, обрезая его (т. Е. Он обрабатывается как& >
).Существует множество других случаев, когда расширения Bash будут выполнять свою функцию при запуске
bash
и будут иметь разные эффекты в чистом POSIXsh
. Например, расширение скобки - это другое, и оно тоже работает в режиме POSIX Bash, а не так.Что касается статических синтаксических ошибок, в Bash есть зарезервированные слова (например,
[[
иtime
), не указанные в POSIX, например,[[ x
допустимый код оболочки POSIX, но синтаксическая ошибка Bash, а также история различных ошибок несовместимости POSIX, которые могут привести к синтаксическим ошибкам, такой как тот из этого вопроса :«Только синтаксические ошибки» - довольно опасное определение «недействительного» для любых обстоятельств, где это важно, но это так.
источник
{fd}>file
аналогичная проблема), так что bash может снова быть совместимым (расширение скобок) останется неопределенным, но совместимые скрипты должны будут сделатьecho "{a,b}"
, если они хотят{a,b}
быть выведены). Смотрите обсуждение, с которого все началось/bin/sh
есть bash, поэтому, если бы я не знал об этом bashism, то при написании командной строки это могло бы легко произойти. Интервал в ответе делает его маловероятным, ноhello&>world
менее надуманным.&>
разницы только в прошлом месяце!Краткий пример:
time
в Bash это зарезервированное слово, и ведет себя не так, как вtime
программе. Вполне вероятно, что вы нарушите некоторые практические сценарии, пытаясь разобрать результатtime
с помощью bash. Но технически это не синтаксическая ошибка. Переопределениеtime
как функция будет редким, но вызывает синтаксическую ошибку, как указывает этот вопрос.Более короткий пример:
Действительно
dash
, но не POSIX-совместимый.источник
time
, есть такие вещи , какdeclare
,function
,select
иcoproc
. Хотя некоторые из них явно помечены как неуказанные в стандарте ( ключевые слова и встроенные функции / утилиты ), но я не вижу, например,time
илиcoproc
в списке. И использование--posix
, кажется, не помогает.