Czy jest jakiś sh
kod, który nie jest poprawnym składniowo kodem bashowym (nie zapisuje kodu przy składni)?
Mam na myśli nadpisanie sh
z bash
pewnych poleceń.
bash
shell-script
posix
Alexander Mills
źródło
źródło
((
przychodzi mi na myśl./usr/bin/sh
jest to tylko sym-link do/usr/bin/bash
(używam CentOS 7.3 i tak jest). Powinieneś sprawdzić, czysh
to naprawdę jestbash
dla twojej dystrybucji.#!/bin/sh
na#!/bin/bash
. Potem wszystko znów działało, więc naprawdę musisz być ostrożny. Może się tak zdarzyć, gdy zaczęli używać myślnika zamiast bash dla sh.Odpowiedzi:
Oto kod, który robi coś innego w POSIX sh i Bash:
Czy to dla ciebie „nieważne”, nie wiem.
W Bash przekierowuje zarówno standardowe wyjście, jak i standardowy błąd z
hello
do plikuworld
. W POSIXsh
działahello
w tle, a następnie dokonuje pustego przekierowaniaworld
, obcinając go (tzn. Jest traktowany jak& >
).Istnieje wiele innych przypadków, w których rozszerzenia Bash zrobią coś, gdy zostaną uruchomione
bash
, i miałyby różne efekty w czystym POSIXsh
. Na przykład rozszerzenie nawiasów klamrowych jest kolejnym, a także działa tak samo w trybie POSIX Basha, a nie.Jeśli chodzi o błędy statycznej składni, Bash ma zarówno zastrzeżone słowa (jak
[[
itime
), które nie są określone przez POSIX, takie jak[[ x
poprawny kod powłoki POSIX, ale błąd składniowy Bash, oraz historia różnych błędów niezgodności POSIX, które mogą powodować błędy składniowe, taki jak ten z tego pytania :Tylko błędy składniowe to dość niebezpieczna definicja „niepoprawna” w każdych okolicznościach, w których ma to znaczenie, ale tak jest.
źródło
{fd}>file
podobny problem), aby bash mógł być ponownie zgodny (rozwinięcie nawiasu) pozostanie nieokreślony, ale zgodne skrypty będą musiały zrobić,echo "{a,b}"
jeśli chcą{a,b}
zostać wyświetlone). Zobacz dyskusję, która ją rozpoczęła/bin/sh
jest bash, więc jeśli nie byłbym aktywnie świadomy tego bashizmu, napisanie linii poleceń mogłoby się łatwo zdarzyć. Odstępy w odpowiedzi sprawiają, że wygląda to mało prawdopodobne, alehello&>world
jest mniej naciągane.&>
różnicy w zeszłym miesiącu!Krótki przykład:
time
w Bash jest słowem zastrzeżonym i zachowuje się inaczej niżtime
program. Jest całkiem prawdopodobne, że złamiesz kilka praktycznych skryptów, próbując przeanalizować wyniktime
za pomocą bash. Ale technicznie nie jest to błąd składniowy. Ponowne zdefiniowanietime
jako funkcji byłoby rzadkie, ale powoduje błąd składniowy, jak to pytanie określa.Krótszy przykład:
Prawidłowe
dash
, ale niezgodne z POSIX.źródło
time
, tam takie rzeczydeclare
,function
,select
, icoproc
. Choć niektóre z nich są wyraźnie oznaczone jako nieokreślona w normie ( kluczowych i builtins / Utilities ), ale nie widzę nptime
lubcoproc
na liście. I używanie--posix
nie wydaje się pomóc.