Kommentit
- Kyse on todella siitä, kuinka kannettava haluat olla . Vain Unixit? Kaikki Linux-kernelipohjaiset laatikot? Kaikki järjestelmät, jopa vanha Win 3.0 ja VMS (tosissasi)?
/bin/sh
on yleensä hyvä minimi, ota huomioon, ettäsh
ei olebash
.. . odottaa useimmissa GNU / Linux -järjestelmissä. - Vaikka Android käyttää linux-ydintä ja oletuskuori on johdettu bashista tuhkan kautta, käyttäjämaa ei hyvin unix-tyyppinen ja puuttuu monia vakiotyökaluja.
vastaus
Siirrettävyyden vuoksi voit olettaa, että #!/bin/sh
löytää enimmäkseen POSIX-yhteensopivan kuoren mistä tahansa tavallisesta Unix- tai Linux-järjestelmästä, mutta siitä on kyse.
FreeBSD: ssä, OpenBSD: ssä ja NetBSD: ssä ( DragonFlyn, PC-BSD: n ja joidenkin muiden johdannaisten kanssa), bash sijaitsee osoitteessa /usr/local/bin/bash
(jos se on asennettu), joten /usr/bin/env
lähestymistapa tarjoaa siirrettävyyden Linuxin ja BSD: n välillä.
Android ei ole tavallinen Unix- tai Linux-järjestelmä. Minulla ei ole juurtunutta Android-puhelinta, mikään seuraavista: /usr/bin/env
, /bin/bash
o r even /bin/sh
on olemassa, ja järjestelmän kuori on /system/bin/sh
.
Shell-komentosarja, josta puuttuu #!
(shebang) yrittää ajaa kuoressa, joka kutsui sen joissakin järjestelmissä, tai voi käyttää erilaista oletustulkkaa (esimerkiksi /bin/bash
) , muissa järjestelmissä. Ja vaikka tämä saattaa toimia Androidissa, sitä ei taata toimivan muissa käyttöjärjestelmissä, joissa käyttäjät voivat päättää käyttää interaktiivista kuorta, joka ei ole bash
. (Käytän tcsh: tä FreeBSD: ssä, missä se on oletuskuori, ja kutsuva kuori tulkitsee komento shebang-vähemmän.)
Joten mistä istun, näyttää siltä, että se on ei ole mahdollista luoda shell-komentosarjaa, joka on siirrettävissä Android- ja muiden kuin Android (Linux tai Unix) -järjestelmien välillä, koska Android tekee asiat eri tavalla.
Kommentit
- Kokemukseni mukaan
/bin/sh
on tarkoitus osoittaa jotain enemmän kuinbsh
taidash
kuinbash
, joka on suhteellisen paisunut ja mieluummin vuorovaikutteista käyttöä varten. - Tässä muutama virhe. Tässä on vielä paljon (enimmäkseen kaupallisia) Täällä olevat yksiköt (joista suurin osa on Solaris 10 ja vanhemmat), joissa
/bin/sh
on Bournen suoja l, ei POSIX-kuori, POSIX ei määritä ' t määritäsh
-polkua. Suurin osa kuorista (jaexecp
/env
/find -exec...
) tulkitsee she-bang- vähemmän komentosarjaa järjestelmällä ' ssh
, harvat tulkitsevat sen itse ja kun tekevät, tekevät sen POSIX-yhteensopivuustilassa. Se ' on tavallinen / POSIX-tapa suorittaa komentosarja, mutta olettaa, että soittaja on POSIX-ympäristössä . - b> * BSD
bash
on valinnainen. Se tarkoittaa, että on hyvät mahdollisuudet siihen, että edes/usr/local/bin/bash
-järjestelmää ei ole (puhumattakaan omistetuista järjestelmistä, kuten Solaris, AIX tai HP-Ux). - @ StephaneChazelas – re POSIX, olen tietysti samaa mieltä ja että ' s miksi käyttämäni sanat olivat " enimmäkseen POSIX-yhteensopivia ". Mutta tämä kysymys koski siirrettävyyttä sen sijaan, mistä löydettäisiin POSIX, eikä ' voi luottaa siihen, että kuori löytyy aina yhdestä paikasta. Oletustulkin osalta tcsh tulkitsee FreeBSD: llä shebang-vähemmän komentosarjan, joka suoritetaan tcsh: ssä. On selvää, että ' on epäjohdonmukaisuuksia myös siellä, joten olen ' päivittänyt vastauksen vastaavasti.
- @Ouki – kyllä tietysti en vain ajatellut ' sitä, että se oli kysymyksen kannalta merkityksellistä. Mutta olen ' lisännyt tämän selvennyksen vastaukseen selkeyden vuoksi.
Vastaa
Kokemukseni mukaan #!/bin/sh
ja #!/bin/bash
ovat aina löytäneet oikean ympäristön joissakin järjestelmissä, joissa olen työskennellyt . Olen vielä kohdannut poikkeuksen. Minusta sitä käytetään myös rutiininomaisesti komentosarjojen komentosarjaan liittyvissä teksteissä, joiden oletan olevan kirjoitettu pitäen mielessä siirrettävyys erilaisen yleisön vuoksi.
Ei voi sanoa samaa #!/usr/bin/env
.Joissakin järjestelmissä se on asennettu nimellä #!/bin/env
ja ovat rikkoneet python-komentosarjoni aiemmin. Joten menen toisen luodin kanssa.
Tässä on joitain tukevia yllä olevalle lausunnolleni:
CentOS-julkaisussa 5.7 saan seuraavan:
$ which env /bin/env
Ubuntu 12.04 Precise Pangolin:
$ which env /usr/bin/env
Lisäksi muistan järjestelmänvalvojat ainakin yhdessä vanhemmassa järjestelmässä asennettu coreutils
kohtaan /opt
jostain syystä (ei ehkä ole paras käytäntö). Koska env
on osa coreutils
, käyttäjät päätyivät siihen osoitteessa /opt/coreutils/bin/env
. Tosin en ole käyttänyt kaikkia siellä olevia järjestelmiä, joten vastaus perustuu rajalliseen kokemukseeni.
/bin/bash
ei todellakaan ole FreeBSD (olisi ole/usr/local/bin/bash
, koska bash ei kuulu oletuskuoriin)./usr/bin/env
(SCO, joka on tynnyri y olemassa oleva NextStep, joka on kaikki kuollut – ja tietysti yleisimmät ei-unix-järjestelmät, kuten Android tai Windows). Toisaalta/bin/bash
on melko paljon vain sulautumattomassa Linuxissa./bin/sh
on turvallinen veto kaikkiin unixeihin, mutta muutamissa vanhemmissa järjestelmissä on muu kuin POSIX Bourne -kuori.which env
isn ' t asiaankuuluva: on olemassa melko monta järjestelmää, joissa/usr/bin
on symboli linkkiin/bin
tai päinvastoin, mikä tekee molemmista/usr/bin/env
ja/bin/env
käytettävissä. Tärkeää on, että/usr/bin/env
on läsnä, mikä pätee kaikkiin Linux-jakeluihin, joista olen ' koskaan nähnyt tai joista olen kuullut (ja poistanut sen) rikkoisi niin monia asioita, ettei kukaan tekisi sitä.)