Чи є код sh, який не є синтаксично дійсним кодом bash?


31

Чи є shкод, який не є синтаксично дійсним кодом bash (не буде barf у синтаксисі)?

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


1
Я думаю, що під вартістю я мав на увазі синтаксично дійсний, так що це не буде барф у синтаксисі
Олександр Міллз

2
Різне токенізація? наприклад, ((приходить в голову.
ccorn

1
Для деяких дистрибутивів /usr/bin/shце лише символьна посилання на /usr/bin/bash(я використовую CentOS 7.3 і це є). Слід перевірити, чи shсправді це bashдля вашого дистрибутива.
Centimane

1
Кілька років тому весь мій проект зламався, коли щось було «модернізоване» в баші. Мені довелося змінити всі мої лінії shebang з #!/bin/shна #!/bin/bash. Потім все спрацювало знову, тож вам справді треба бути обережними. Це могло статися, коли вони почали використовувати тире замість bash для sh.
Джо

1
@Joe, це протилежне тому, що просить ОП - у вас був код bash, який був неправильно позначений як код sh, але не був. ОП запитує, чи може вони мати (фактичний, не неправильно позначений) код sh, який ламається, коли він працює з bash, а не якщо вони можуть мати bash-код, який порушується, коли він працює з sh (що очевидно - якщо bash розширення не зробили впливають на доступні мовні функції, вони не будуть розширеннями).
Чарльз Даффі

Відповіді:


49

Ось якийсь код, який робить щось інше в POSIX sh та Bash:

hello &> world

Чи це для вас "недійсне", я не знаю.

У Bash, він перенаправляє як стандартний висновок і стандартну помилку з helloв файл world. У POSIX shвін працює helloу фоновому режимі, а потім робить порожнє перенаправлення на world, обрізаючи його (тобто воно трактується як& > ).

Існує маса інших випадків, коли розширення Bash роблять свою справу під час запуску bashта матимуть різний ефект у чистому POSIX sh. Наприклад, розширення дужок - це ще одне, і воно теж працює те саме в режимі POSIX Баша, і ні.


Що стосується статичних синтаксичних помилок, у 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

Синтаксичні помилки - це досить небезпечне визначення "недійсного" за будь-яких обставин, де це має значення, але воно є.


3
Зауважте, що в той час, як розширення дужок в даний час робить bash (і zsh, pdksh, ksh93) невідповідним, POSIX працює над додаванням положення в специфікацію, щоб дозволити розширення дужок (і {fd}>fileаналогічну проблему), так що bash може бути знову відповідним (розширення дужки) Залишається не визначеним, але відповідні сценарії потрібно робити echo "{a,b}", якщо вони хочуть {a,b}вивести). Дивіться дискусію, що розпочала його
Стефан Шазелас

2
Також стосується цього питання і запитань: austingroupbugs.net/view.php?id=1191#c3983
Stéphane Chazelas

2
Хтось, хто пише сценарій в POSIX, коли-небудь напише таку команду? ОП йде від ш до баш, і з мого розуміння це здається, що це було б більше проблеми в іншому напрямку?
Багатий

1
@Rich: Звичайно. Я не використовую жодної системи, де /bin/shє bash, тому, якби я не був активно обізнаний з цим башизмом, написання командного рядка це може бути легко. Відстань у відповіді робить це малоймовірним, але hello&>worldменш надуманим.
Р ..

2
Я фактично побачив помилку через &>різницю лише минулого місяця!
Гордон Девіссон

16

Короткий приклад:

time()(:)

timeу Bash - це застережене слово і поводиться не так, як у timeпрограмі. Цілком ймовірно, що ви порушите кілька практичних сценаріїв, намагаючись проаналізувати результат time, використовуючи bash. Але технічно це не синтаксична помилка. Перевизначення timeяк функції буде рідкісним, але викликає синтаксичну помилку, як зазначено в цьому питанні.

Коротший приклад:

a():

Дійсний dash, але не сумісний з POSIX.


3
Загалом, будь-яке слово, яке є нестандартним ключовим словом або вбудованою командою в Bash, спричинить той же ефект. На додаток до time, є такі речі , як declare, function, selectі coproc. Хоча деякі з них у стандарті явно позначені як невизначені ( ключові слова та вбудовані / утиліти ), але я не можу бачити, наприклад, timeабо coprocу списку. І використання --posix, здається, не допомагає.
ilkkachu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.