Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam!
Orientuje się ktoś w tym? Jest na przykład skrypt w bashu - no, ale wyrzucam z niego wszelkie "bashinizmy" i zmieniam shebang na !#/bin/sh - no właśnie i jeżeli pod !#/bin/sh skrypt działa to wymagane jest jeszcze jakieś działanie? Żeby było zgodnie ze sztuką musi działać pod wszystkimi możliwymi? - tzn, tcsh, zsh, ksh, csh ? Pod bashem zwykle bezproblemowo działa to co działa przez /bin/sh. Jak to z tym jest?
Offline
% ls -l /bin/sh lrwxrwxrwx 1 root root 4 mar 1 2012 /bin/sh -> dash
Tak w kwestii /bin/sh
Jak widać w Debianie /bin/sh to nie bash ani nawet sh. To dash. I potem w skryptach robi się problem gdy ma być przenośny. Ostatnio miałem taki problem z OSSEC IDS. Ich skrypt instalacyjny zaczynał się od shebanga #!/bin/sh przez co instalacja się wywalała, bo w dashu nie ma skróconej operacji testu w formie [ ] .
Offline
A czy POSIX to nie standard ogólny dla Linuksów / Uniksów, chodzi mi o rozmieszczenie katalogów, domyślne programy itd.?
Fervi
PS. W teorii Bash najpopularniejszy, ale możesz przetestować na różnych
Offline
fervi napisał(-a):
A czy POSIX to nie standard ogólny dla Linuksów / Uniksów, chodzi mi o rozmieszczenie katalogów, domyślne programy itd.?
Przed 1977, nie było problemu ze standaryzacją UNIX'a, po tym roku [na niwie zmiany prawa licencyjnego w US], kiedy AT&T umożliwiono sprzedaż licencji kodu źródłowego najpierw ośrodkom naukowym, a potem praktycznie każdemu zainteresowanemu, kogo było na to stać; problem takowy zaczął się pojawiać.
Od lat 80'tych masz rozwój wielu wersji UNIX'a, przez różnych developerów. Nawet Microsoft miał przygodę ze swoim XENIXEM; który był praktycznie kopią Systemu V --> problem w tym że XENIX miał za duże wymagania systemowe jak na ówczesne nowo wprowadzone komputery domowe IBM; takoż powstał klon systemu Digital Research CP/M, którego autorem był Tim Paterson, ów klon znamy do dzisiaj pod nazwą MS-DOS.
Wracając do UNIX'a.
Prawie każdy 'nabywca' kodu miał swoją wizję rozwoju systemu; co spowodowało dość duży bałagan, odczuwalny zwłaszcza w II połowie lat 80'tych.
Wtedy też poczęto prace nad standaryzacją.
W 1983 r. Amerykański Narodowy Instytut Standaryzacji tj. ANSI powołał komitet, którego zadaniem było sformułowanie nowoczesnej, wszechstronnej definicji języka C. Pod koniec 1989 r. zaczął obowiązywać nowy standard języka programowania C - ANSI Standard X.3159-1989. Zyskał on rangę międzynarodową jako standard ISO/IEC 9899:1990.
POSIX rozwijany przez organizację IEEE [Institute of Electrical and Electronics Engineers], odnosił się początkowo do standardu 1003.1-1988 tj. interfejsu systemu operacyjnego, IEEE z czasem rozwinął standardy, jak np. o 1003.2; który ma identyfikować standard dla powłok oraz programów wspomagających, a 1003.7 ma być standardem administrowania systemem etc.
Offline
Jak widać w Debianie /bin/sh to nie bash ani nawet sh. To dash. I potem w skryptach robi się problem gdy ma być przenośny. Ostatnio miałem taki problem z OSSEC IDS. Ich skrypt instalacyjny zaczynał się od shebanga #!/bin/sh przez co instalacja się wywalała, bo w dashu nie ma skróconej operacji testu w formie [ ] .
/bin/sh - to w Linuxie zawsze jest dowiązanie symboliczne do aktualnego interpretera powłoki.
Z interpreterów powłoki najpopularniejsze, to bash i zsh, jest też dash, csh, tcsh i kilka innych.
Przywiązania Debiana do powłoki Dash nie rozumiem specjalnie, osobiście używam Basha.
Pozdrawiam
;-)
Offline
enether napisał(-a):
bo w dashu nie ma skróconej operacji testu w formie [ ] .
Możesz rozwinąć?
root@srv03:~# echo '[ -e /etc/passwd ]; echo $?' | dash 0 root@srv03:~# echo '[ -e /etc/passwd2 ]; echo $?' | dash 1 root@srv03:~#
Offline
milyges napisał(-a):
enether napisał(-a):
bo w dashu nie ma skróconej operacji testu w formie [ ] .
Możesz rozwinąć?
Kod:
root@srv03:~# echo '[ -e /etc/passwd ]; echo $?' | dash 0 root@srv03:~# echo '[ -e /etc/passwd2 ]; echo $?' | dash 1 root@srv03:~#
Ehm, my bad. Pamięc zawiodła. Dokładny komunikat błędu brzmiał:
./install.sh: 372: ./install.sh: [[: not found
Czyli chodziło o [[
Offline
[[ ]] nie jest POSIX-owe.
Autor install.sh spartolił i wrzucił bashyzm w skrypt /bin/sh. Nie ma w tym żadnej winy ani dasha, ani żadnej innej powłoki.
Offline
Nigdzie nie stwierdziłem że winny jest dash. Zwyczajnie wskazałem na to że sh to nie zawsze powłoka bourne'a a powłoka którą twórcy dystrybucji uznali za słuszną na to miejsce.
Offline
Jacekalex napisał(-a):
Z interpreterów powłoki najpopularniejsze, to bash i zsh, jest też dash, csh, tcsh i kilka innych.
Przywiązania Debiana do powłoki Dash nie rozumiem specjalnie, osobiście używam Basha.
Bash jest dość mułowaty i stąd dowiązanie /bin/sh→/bin/dash, ale jest przecież dalej domyślną powłoką interaktywną.
Offline
Mułowaty? Zależy na jakim sprzęcie, może w okolicach Debiana Etch i Ubuntu 6.10 i ówczesnego sprzętu to było aktualne, ja na C2D nie widzę żadnej różnicy między oboma interpreterami, natomiast Bash ma wbudowany silnik regex, czego o ile się nie mylę Dash nie posiada, i jest odporny na rozmaite bashyzmy, których pełno na necie,
a i w systemie się zdarza, jak w sławnym błędzie Gentoo'wego OpenRC, który wołał o /bin/sh, choć skrypty były pisane w bashu,
i w starszych wersjach trzeba było kombinować specjalną łatkę, żeby OpenRC wołał o basha a nie sh, jeśli ktoś miał np sh -> zsh.
Jeśli natomiast chodzi o szybkość większych i bardziej skomplikowanych skryptów, to i tak zazwyczaj staram się takowe robić w perlu, ze względu na brak ograniczeń, jakie posiadają typowe interpretery powłoki.
Perlizmy natomiast można spokojnie przenosić między wszystkimi Linuxami, BSD, i MacOS, nawet na Win$ można ich w jakimś stopniu używać.
To też jest pewna zaleta, której Bash czy Dash nie posiadają w takim stopniu.
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2013-05-23 18:03:52)
Offline
Jacekalex napisał(-a):
Mułowaty? Zależy na jakim sprzęcie, może w okolicach Debiana Etch i Ubuntu 6.10 i ówczesnego sprzętu to było aktualne, ja na C2D nie widzę żadnej różnicy między oboma interpreterami, natomiast Bash ma wbudowany silnik regex, czego o ile się nie mylę Dash nie posiada, i jest odporny na rozmaite bashyzmy, których pełno na necie (...)
To raczej kwestia tego, że rozbudowane funkcje basha są zbędne powłoce nieinteraktywnej, natomiast negatywnie odbijają się na wydajności, a Debian z założenia ma działać na bardzo różnym sprzęcie. No i zawsze to dobra okazja do eliminacji bashyzmów. W przypadku Debiana odbyło się to głównie kosztem użytkowników Ubuntu, które pierwsze wprowadziło tę zmianę ;)
Offline
Dla mnie również domniemana mułowatość basha to jakiś absurd przy dzisiejszych komputerach. Na wirtualnym Wheezy w KVM, zainstalowałem sobie wszystkie te powłoki (bash, dash, zsh, ksh, tcsh, csh). O ile w przypadku pierwszych czterech rzeczywiście można pisać w miarę "uniwersalny" skrypt to te "tcsh" i "csh" to chyba jakieś stare nierozwijane dziadki,
Offline