Mitä eroa on komentojen suorittamisessa bashin ja sh: n välillä?

Suoritetaanko bash ja sh komentosarja eri tavalla? Suoritin shell-skriptin sekä bashilla että sh: llä ja sain saman tuloksen. Joten mikä ero on?

Kun suoritat vain ./executable, käyttääkö se bashia tai sh: tä?

Kommentit

  • @Pandya Muuttujaa $SHELL ei käytetä päättämään, mikä kuori tulkitsee ./executable käsikirjoitus. Se ei välttämättä kerro ' myöskään sitä, mikä nykyinen kuori on.
  • @jlliagre oh! ok. wiki.debian.org sanoo " SHELL = Nykyinen kuori. "
  • @Pandya: n pitäisi itse asiassa sanoa " Käyttäjä ' -kirjautumisen kuori ". Nykyinen kuori voi olla erilainen.

Vastaa

Se riippuu käyttämästäsi järjestelmästä. Yksi monista käyttöjärjestelmistä, etenkin Linux-pohjaisista, sh on linkki bash -ohjelmaan.

Tällöin siellä ovat edelleen joitain eroja käyttäytymisessä, jossa bash yrittää olla enemmän kuin perinteinen bourne-kuori, kun sitä kutsutaan sh, mutta se hyväksyy silti useimmat basismit. / p>

Joissakin muissa käyttöjärjestelmissä, kuten Debian-pohjaisissa käyttöjärjestelmissä, sh tarjoaa dash, ei bash. Tällä on paljon suurempi ero, koska dash ei tue basismeja, jotka on suunniteltu puhtaaksi POSIX-kuoren toteutukseksi.

Omistetuissa käyttöjärjestelmissä sh tarjoaa usein joko POSIX-yhteensopiva ksh88, joka kuten dash, ei toteuta basismeja. Solaris 10: ssä ja sitä vanhemmissa versioissa sh on todennäköisesti vanhempi Bourne-kuori, joka edeltää POSIXia.

Joka tapauksessa olet todennäköisesti saanut sama tulos testisi kanssa yksinkertaisesti siksi, että komentosarjasi ei käyttänyt mitään bash -komentoa, vaihtoehtoa tai syntaksia.

Kun suoritat ./executable, mikä komentotulkki suoritetaan, riippuu olennaisesti .executable-komentosarjan alkuun kirjoitetusta shebangista. Se on bash, jos shebang määrittää sen:

#!/bin/bash .... 

Jos shebangia ei ole ja soitat komentosarjaan POSIX-yhteensopivasta kuoresta komentosarja tulisi teknisesti suorittaa PATH: sta löydetyn ensimmäisen sh avulla. Monet shell-tulkit, kuten bash, dash ja ksh, pitävät itseään POSIXina niin tulkita käsikirjoitusta. Huomaa, että ympäristömuuttujaa SHELL ei käytetä tässä.

Kommentit

  • Katsoin ympärillä /bin ja huomasin, että sh on symbolinen linkki linkkiin dash eikä bash. Joten miten he juoksivat samalla tavalla? Se ei ollut ' oikeastaan käynnissä mitään bash-komentokomentoja, vain terminaalikomennot käyttämään muita paketteja '.
  • Jos komentotulkkikomentosi kutsuu vain peräkkäin muita komentoja, mikä tahansa komentotulkki ajaa sen samalla tuloksella. Ei mitään odottamatonta.
  • Tämä ei ole ' t liittyvä kysymykseen, mutta mikä on tarkalleen ero bash välillä ja dash?
  • Molemmat käyttävät Bourne-kuoren syntaksia. Kuten kirjoitin vastauksessani, dash on POSIX-kuoristandardin puhdas toteutus. Toisaalta bash on kuori, jolla on melko suuri määrä laajennuksia ja epätyypillisiä ominaisuuksia. Jotkut ovat innoittamana ksh, ksh93 ja muut kuoret, ja jotkut bash-spesifiset, tunnetaan bashismina. On olemassa työkalu nimeltä checkbashisms, joka auttaa tunnistamaan kaiken, mitä ei ole ehdottomasti siirrettävissä tietyssä komentosarjassa.

Vastaa

Kyllä se voi olla, mutta sen ei tarvitse olla. Nämä kaksi kuorta eivät ole samat, mutta perusasiat ovat yhteensopivia. Tarkista tämä viesti saadaksesi lisätietoja.

Voit tarkistaa käyttämäsi tulkin komentosarjassa seuraavalla rivillä:

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

Voit määrittää nimenomaisesti kuoren, jota käytetään, kun komentosarja suoritetaan suoraan rivillä sheebang:

#!/bin/sh 

tai

#!/bin/bash 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *