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
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 linkkiindash
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ä jadash
? - Molemmat käyttävät Bourne-kuoren syntaksia. Kuten kirjoitin vastauksessani,
dash
on POSIX-kuoristandardin puhdas toteutus. Toisaaltabash
on kuori, jolla on melko suuri määrä laajennuksia ja epätyypillisiä ominaisuuksia. Jotkut ovat innoittamanaksh
,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
$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.