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/shon yleensä hyvä minimi, ota huomioon, ettäshei 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/shon tarkoitus osoittaa jotain enemmän kuinbshtaidashkuinbash, 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/shon 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
bashon 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/bashei 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/bashon melko paljon vain sulautumattomassa Linuxissa./bin/shon turvallinen veto kaikkiin unixeihin, mutta muutamissa vanhemmissa järjestelmissä on muu kuin POSIX Bourne -kuori.which envisn ' t asiaankuuluva: on olemassa melko monta järjestelmää, joissa/usr/binon symboli linkkiin/bintai päinvastoin, mikä tekee molemmista/usr/bin/envja/bin/envkäytettävissä. Tärkeää on, että/usr/bin/envon 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ä.)