Mi a különbség a bash és az sh használata között egy szkript futtatásához?

A bash és a sh másképp hajtanak végre egy szkriptet? Végrehajtottam egy shell parancsfájlt bash-val és sh-vel, és ugyanazt a kimenetet kaptam. Tehát mi a különbség?

Ezenkívül, amikor éppen futtatja az ./executable fájlt, bash-t vagy sh-t használ?

Megjegyzések

  • @Pandya A $SHELL változót nem arra használjuk, hogy eldöntsük, melyik shell értelmezi a ./executable forgatókönyv. Ez sem ' nem feltétlenül mondja el, hogy mi az aktuális shell.
  • @jlliagre ó! rendben. wiki.debian.org szerint " SHELL = Az aktuális shell. "
  • @Pandya valójában azt kell mondania, hogy " A ' felhasználó bejelentkezési héja ". Az aktuális héj eltérhet.

Válasz

Ez a futtatott rendszertől függ. Egy sok operációs rendszer, különösen Linux alapú, sh egy link a bash linkre.

Ilyen esetben ott van még mindig vannak olyan viselkedési különbségek, ahol bash megpróbál inkább hasonlítani a hagyományos bourne-héjra, ha sh -nek hívják, de mégis elfogadja a legtöbb basizmust. / p>

Néhány más operációs rendszeren, például a Debian-alapúakon, a sh szolgáltatást a dash szolgáltatja, nem pedig a bash. Ez sokkal nagyobb különbséget jelent, mivel a dash nem támogatja a basizmusokat, mivel ezeket tiszta POSIX shell-implementációnak tervezték.

Saját operációs rendszereken a sh szolgáltatást gyakran egy POSIX-kompatibilis ksh88 szolgáltatja, amely dash -hez hasonlóan nem hajtja végre a basizmusokat. Solaris 10-es vagy annál régebbi verziókon, attól függően, hogy mi a PATH-ja, a sh valószínűleg egy régi Bourne-héj lesz, amely megelőzi a POSIX-ot.

Mindenesetre valószínűleg kapott ugyanazt a kimenetet a tesztjével egyszerűen azért, mert a szkript nem használt bash specifikus parancsot, beállítást vagy szintaxist.

Az , hogy milyen futtatásra kerül a futtatás, lényegében a .executable szkript elején írt shebangtól függ. Ez bash lesz, ha a shebang megadja:

#!/bin/bash .... 

Ha nincs shebang, és meghívod a szkriptet egy POSIX-kompatibilis shellről a parancsfájlt technikailag a PATH-ban található első sh segítségével kell végrehajtani. Sok shell értelmező, például bash, dash és ksh POSIX-nak tartja magát, így lesz értelmezze a forgatókönyvet. Ne feledje, hogy a SHELL környezeti változót nem itt használjuk. div id = “3420465ea1″>

és azt tapasztaltam, hogy a sh szimbolikus link a dash -re, nem pedig a bash. Tehát hogyan futottak ugyanúgy? ' nem igazán futott semmilyen bash szkriptparancs, csupán terminálparancsok más csomagok ' eszközök használatához.

  • Ha a shell parancsfájl csak egymás után hívja meg a parancsokat, bármely shell értelmező ugyanazzal az eredménnyel futtatja. Itt semmi váratlan.
  • Ez nem ' t kapcsolódik a kérdéshez, de pontosan mi a különbség bash között és dash?
  • Mindkettő a Bourne shell szintaxist használja. Amint azt válaszomban írtam, a dash a POSIX shell szabvány tiszta megvalósítása. Másrészt a bash egy héj, amely meglehetősen sok kiterjesztéssel és nem szabványos funkcióval rendelkezik, némelyiket a ksh, ksh93 és más héjak, valamint néhány bash specifikus, bashizmus néven ismert. Van egy checkbashisms nevű eszköz, amely segít azonosítani mindazt, ami nem szigorúan hordozható egy adott shell scriptben.
  • Válasz

    Igen lehet, de nem muszáj. A két héj nem azonos, de az alapok kompatibilisek. További részletekért ellenőrizze ezt a bejegyzést .

    A szkriptben a következő sort használhatja a használt tolmács ellenőrzésére:

    ps h -p $$ -o args="" | cut -f1 -d" " 

    Kifejezetten megadhatja azt a héjat, amelyet akkor kell használni, amikor a parancsfájlt közvetlenül végrehajtják a sheebang sorral:

    #!/bin/sh 

    vagy

    #!/bin/bash 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük