• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

bash oder sh Verständnissproblem

Hi @ all,
ich suche nun schon seid Stunden aber finde inrgendwie nicht das passende zu meinem Problem.

Ich habe ein script zu überarbeiten, welches mit
Code:
#!/sbin/sh
beginnt.

Dieses script sollte doch meiner Meinung nach immer unter standard Shell laufen? Wenn ich aber via Putty eingelogt bin (mit Parameter /bin/bash weil bequemer) laufen einige Befehle völlig aus dem Ruder?

Ich dachte die bash wäre voll abwärtskompatibel zur sh?
Also müsste doch jedes sh-Script unter einer bash auch funktionieren?

Danke schonmal :)
Dirk
 
Die ist auch voll abwärtskompatibel.
Evtl. hast du einige Variablen anders gesetzt?

Was ist denn wenn du in der Bash in die sh wechselst?
bzw das script per /bin/sh script aufrufst?

Gruß Dominik
 
Jepp das funktioniert dann wieder super.
Wenn ich also vor dem Aufruf des scripts
Code:
/bin/sh
ausführe funktioniert das script. Ich habe da nicht den genauen Überblick was es macht, denn es verändert mir auch in manchen Situationen die Zeilenzahl der Anzeige, formatiert die Anzeige usw...
Ich versuche es immer noch irgendwie zu verstehen, bin da aber leider nicht tief genug drin... Noch nicht :)
Wie muss ich denn in einem Script die Shell mitgeben, dass diese auch verwendet wird?
 
Öhm wo liegt der Unterschied, ob ich
Code:
/sbin/sh
aufrufe, oder
Code:
/bin/sh
?

Nicht das ich es nicht glaube, aber ich bin bei Solaris da nicht so sicher.
Das script läuft übrigens auf
Reliant Unix, Solaris und Linux ...
Naja es soll es mal :)
 
Es gibt kein /sbin/sh.

Jedes script wird mit dem Interpreter, den du in der ersten Zeile angibst interpretiert.

Gruß Dominik
 
Code:
(solaris):/tmp
root -> ls -lisa /sbin/s*
      2918  608 -r-xr-xr-x   2 root     root      302328 Jan 15  2005 /sbin/sh
      2441  480 -r-xr-xr-x   1 root     bin       229980 Apr  7  2002 /sbin/soconfig
      2228    2 lrwxrwxrwx   1 root     root          13 Mar 29  2006 /sbin/su -> ../usr/bin/su
      2442 1792 -r-xr-xr-x   1 root     sys       902580 May 11  2004 /sbin/su.static
      2443 1712 -r-xr-xr-x   1 root     bin       865704 Jan 10  2004 /sbin/sulogin
      2444    8 -rwxr--r--   1 root     sys         3157 Apr  7  2002 /sbin/swapadd
      2445  464 -r-xr-xr-x   1 root     bin       227436 Apr  7  2002 /sbin/sync
(prifive):/tmp

soviel zu es gibt kein ...
Ich kenne mich nicht mit den shells aus, leider. Aber wo sind die Unterschiede zwischen /bin/sh und /sbin/sh?
 
A

Anonymous

Gast
In Solaris sind eine ganze Reihe von Shells und andere Befehle in unterschiedlichen Verzeichnissen zu finden, die verschiedene Kompatibilitäten abdecken. Die normale sh ist soweit ich mich erinnere, ein Hardlink auf jsh.

Wenn du für Reliant, Solaris und Linux schreiben willst, dann gehe am besten auf die ksh, die muss zwar bei Linux nachinstalliert werden, ist aber die beste Möglichkeit bösen Überraschungen aus dem Weg zu gehen. Je nach dem wie kompliziert dein Script wird, musst du noch mit weiteren Problemen rechnen zB bei grep awk test und natürlich den Terminaleinstellungen. Wegens der Kompatibilität kannst du bei Solaris bei einigen Befehlen auf die Befehle unterhalb /usr/xpg4/bin/ zurückgreifen.

Bei komplizierten Scripten ist es ratsam am Anfang des Scriptes das BS abzufragen und dann je nach BS die einzelnen Befehle mit dem entsprechenden Path in eine Variable abzulegen. Im Script wird dann nur die Variable verwendet.

robi
 
Ah Licht am Ende des Tunnels :cool:
Wie finde ich denn raus ob ich mich in der jsh befinde? Mein Problem ist, dass ich dieses Script nur anpassen muss, es also nicht selbst entwickelt habe. Und da ich noch nie z.B. Terminaleinstellungen missbraucht habe stehe ich da voll aufm Schlauch...
/usr/xpg4/bin/sh existiert auch, nur die Frage ist mache ich mir damit nicht eine weitere Baustelle auf, da ich ja das script dann für jeden der 5 Server anpassen muss. Auf Solaris 8 + 9 und Reliant läuft es derzeit mehr schlecht als recht, ich muss halt vorm Aufruf manuell in die richtige Shell wechseln :-(

Kennt sich denn jemand mit diesen "formatierungen" aus, oder besser gefragt wo finde ich was dazu, oder in welchem Forum könnte ich das Posten?

Fragen über Fragen, aber danke euch für die super schnelle Hilfe.
 
A

Anonymous

Gast
funon schrieb:
Kennt sich denn jemand mit diesen "formatierungen" aus, oder besser gefragt wo finde ich was dazu, oder in welchem Forum könnte ich das Posten?

Was du alles einstellen musst ist natürlich von deinem Script abhängig aber hier mal ein Beispiel wie man zB Umgebungsvariablen für ein gemeinsames Script bei unterschiedlichen Betriebssystemen setzen könnte. Das kannst du für dich umbauen und erweitern.
Code:
TYP=`uname`
case $TYP in
"Linux" )   BS=linux ; export BS
                LC_ALL=de_DE; export LC_ALL
                LANG=de; export LANG
                LOGFILE="/var/log/messages";export LOGFILE ;;
"SunOS" )   BS=sun ; export BS
                LANG=C; export LANG
                LOGFILE="/var/adm/messages";export LOGFILE ;;
"SINIX-Z" )   BS=sinixz ; export BS
                LC_COLLATE=De ; export LC_COLLATE
                LANG=De ; export LANG
                LOGFILE="/var/adm/log/messages";export LOGFILE ;;
"SINIX-N" )   BS=RM ; export BS
                LC_COLLATE=De ; export LC_COLLATE
                LANG=De ; export LANG
                LOGFILE="/var/adm/log/messages";export LOGFILE ;;
"SINIX-Y" )   BS=RM ; export BS
                LC_COLLATE=De ; export LC_COLLATE
                LANG=De ; export LANG
                LOGFILE="/var/adm/log/messages";export LOGFILE ;;
"ReliantUNIX-Y" )   BS=RM ; export BS
                LOGFILE="/var/adm/log/messages";export LOGFILE ;;
"ReliantUNIX-N" )   BS=RM ; export BS
                LOGFILE="/var/adm/log/messages";export LOGFILE ;;
"HP-UX" )        BS=HP ; export BS
                LANG=C; export LANG
                LC_CTYPE="C"; export LC_CTYPE
                LC_COLLATE="C"; export LC_COLLATE
                LC_MONETARY="C"; export LC_MONETARY  
                LC_NUMERIC="C" ; export LC_NUMERIC
                LC_TIME="C" ; export LC_TIME   
                LC_MESSAGES="C" ; export LC_MESSAGES
                LOGFILE="/var/adm/syslog/syslog.log";export LOGFILE ;;
esac
Hier könntest du auch PATH setzen oder Shells oder oder oder
Es wird hier auch eine Variable BS konfiguriert, mit der du im weiteren Verlauf des Scriptes immer wieder auf die Eigenarten des Betriebssystems duch Verzeigung dieser Variable eingehen könntest.

robi
 
Oben