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
[quote=fervi]A czy POSIX to nie standard ogólny dla Linuksów / Uniksów, chodzi mi o rozmieszczenie katalogów, domyślne programy itd.?[/quote]
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 [b]ani nawet sh[/b]. 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 [ ] .[/quote]
/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
;-)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
[quote=enether]bo w dashu nie ma skróconej operacji testu w formie [ ] .[/quote]
Możesz rozwinąć?
root@srv03:~# echo '[ -e /etc/passwd ]; echo $?' | dash 0 root@srv03:~# echo '[ -e /etc/passwd2 ]; echo $?' | dash 1 root@srv03:~#
Offline
[quote=milyges][quote=enether]bo w dashu nie ma skróconej operacji testu w formie [ ] .[/quote]
Możesz rozwinąć?
root@srv03:~# echo '[ -e /etc/passwd ]; echo $?' | dash 0 root@srv03:~# echo '[ -e /etc/passwd2 ]; echo $?' | dash 1 root@srv03:~#
[/quote]
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
[quote=Jacekalex]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.[/quote]
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
[quote=Jacekalex]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 (...)[/quote]
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
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00136 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.227.52.248' WHERE u.id=1 |
0.00059 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.227.52.248', 1732453998) |
0.00057 | SELECT * FROM punbb_online WHERE logged<1732453698 |
0.00066 | DELETE FROM punbb_online WHERE ident='18.191.129.241' |
0.00062 | DELETE FROM punbb_online WHERE ident='3.136.236.178' |
0.00062 | SELECT topic_id FROM punbb_posts WHERE id=233191 |
0.00107 | SELECT id FROM punbb_posts WHERE topic_id=23574 ORDER BY posted |
0.00059 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=23574 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00091 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=23574 ORDER BY p.id LIMIT 0,25 |
0.00080 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=23574 |
Total query time: 0.00799 s |