shell-komentosarjan otsikko parhaan yhteensopivuuden saavuttamiseksi [kaksoiskappale]

Tähän kysymykseen on jo annettu vastauksia :

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 ole bash .. . 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 kuin bsh tai dash kuin bash, 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 (ja execp / env / find -exec...) tulkitsee she-bang- vähemmän komentosarjaa järjestelmällä ' s sh, 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.

Kommentit

  • Esimerkiksi /bin/bash ei todellakaan ole FreeBSD (olisi ole /usr/local/bin/bash, koska bash ei kuulu oletuskuoriin).
  • Se ' on päinvastoin: vain joistakin hyvin harvoista järjestelmistä puuttuu /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.
  • @Gilles Kiitos tiedoista. Päivitin vastaukseni tarjoamalla todisteita siitä, mitä olen nähnyt joissakin törmänneissä järjestelmissä.
  • 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ä.)

Vastaa

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