S-vaihtoehto bashille ei näytä tekevän oikeastaan mitään.
Kun suoritan komentoja ilman sitä mikään ei muutu. Mikä todella hämmentää minua, kun suoritan shell-komentosarjan, näyttää siltä, että saan aina vuorovaikutteisen shellin. Oletan sen olevan vuorovaikutteinen, koska kun käytän komentosarjassa olevaa sisäänrakennettua luettua, se kehottaa minua aina input. Tekeekö siitä interaktiivisen?
Suoritetaanko komentosarjan interaktiivisuutena fedorassa, ja onko olemassa esimerkkejä eroista, joita -s voi tehdä? Olen lukenut man-sivut, mutta en voi näyttävät tuottavan omia esimerkkejä, joilla olisi mitään vaikutusta. Yhdistin nämä kaksi kysymystä, koska yritin käyttää s: ää muuttamaan sitä, miten komentosarja vastaanotti syötteen, ja joissakin opetusohjelmissa he sanovat, että sillä on vaikutusta. Ymmärrän, että se voi asettaa argumentteja, mitä en saa, on se, miten se muuttaa sen lukemaan tavallisesta syötteestä, se näyttää aina tekevän niin joka tapauksessa
Tässä käytin testaamaan sitä
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
read pystyi aina toimimaan sekä ei-interaktiivisissa kuoreissa
Vaikka testasin fd / 0- ja fd / 1-läsnäoloa ei-vuorovaikutteiset kuoret ne olivat edelleen olemassa
Kiitos jo etukäteen
Vastaa
Bash määrittää myös, onko vai ei se ei ole interaktiivinen tutkimalla, onko sen tulo / lähtö liitetty päätteeseen.
Ei-vuorovaikutteinen -s
-kytkin antaa bash-komentosarjalle mahdollisuuden käsitellä sijaintiparametreja, kun komentojen lukeminen tiedostosta. esim .:
$ cat demo.sh echo "$0 = " $0 echo "$1 = " $1 echo "$2 = " $2 $ bash < demo.sh foo bar bash: foo: No such file or directory $ bash -s < demo.sh foo bar $0 = bash $1 = foo $2 = bar
Vastaa
-s
-vaihtoehto saa bashin lukemaan komentoja vakiotulostaan. Ilman tätä vaihtoehtoa bash käsittelee ensimmäistä argumenttiaan suoritettavan komentosarjan nimellä. Vaihtoehto, bash käsittelee kaikkia argumenttejaan argumentteina skriptille, jonka se lukee tavallisessa syötteessä. -s
-vaihtoehto määrittää vain, kuinka bash tulkitsee komentoriviargumenttinsa, ei siitä, onko komentotulkki interaktiivinen.
Bash-esiintymä on aina vuorovaikutteinen, jos se käynnistetään -i
-vaihtoehdolla. Ilman -i
, se on vuorovaikutteinen vain, jos komentosarjan nimeä ei välitetä (-s
vaikuttaa tähän) ja sekä vakiotulo että vakiovirhe on kytketty pääte.
PS1
-testaus ei kerro, onko komentotulkki interaktiivinen.¹ Voit poistaa PS1
interaktiivisessa kuoressa. Päinvastoin, ei-interaktiivinen kuori perii usein PS1
ympäristöstään. Luotettava tapa testata, toimiiko kuori vuorovaikutteisesti, on testata, sisältääkö $-
i
.
read
sisäänrakennettu toimii mistä tahansa kuoresta, interaktiivisesta tai ei. Se lukee kaikesta, mikä on kytketty komentotulkin vakiotuloon (ellei uudelleenohjata). Jos yrität lukea samasta tiedostokuvaajasta, jossa bash lukee suoritettavaa komentosarjaa, ohitat rivin komentosarjassa (ei välttämättä haluamassasi paikassa); esimerkiksi, jos ohitat komentosarjan bashin vakiotulossa ja haluat lukea rivin päätelaitteesta, sinun on ohjattava read
kutsu: read line </dev/tty
.
Tiedostokuvaajat 0, 1 ja 2 ovat aina olemassa (ellei niitä ole suljettu); ne ovat vastaavasti vakiotulo, vakiolähtö ja vakiovirhe. Se, onko kuori vuorovaikutteinen vai ei, ei liity siihen, mihin vakiokuvaajat viittaavat, paitsi että se, ovatko fd 0 ja 2 päätelaitteita, vaikuttaa kuoren interaktiiviseen tilaan.
¹ Kyllä, I ”m tietoinen siitä, että on olemassa verkkosivuja, jotka väittävät tämän. Ne ovat väärässä.
Vastaa
Hieman lisätietoja interaktiivisista kuoreista:
Voit selvittää, onko kuori vuorovaikutteinen vai ei, tarkistamalla $-
. Jos $-
sisältää i
, kuori on vuorovaikutteinen.
Kuori on interaktiivinen, kun se lukee käyttäjän syötteen suoraan. Ei-interaktiivinen kuori lukee komentoja tiedostosta rivi riviltä ja suorittaa ne. Se ei tee kuoresta vuorovaikutteista lukiessasi mitään stdinistä komentosarjan sisällä, koska ”komentosarja lukee syötteen, ei kuorta” (älä osaa selittää tätä paremmin).
labdebian# cat ./test #!/bin/bash echo Hello World echo $- read; echo $REPLY echo $- labdebian# bash test Hello World hB I"m typing this I"m typing this hB labdebian# bash -i test Hello World himB I"m typing this I"m typing this himB
Kommentit
- Hämmentävää on bash-dokumentaatiossa. He sanovat, että se jumittuu, jos käytät lukea muussa kuin – vuorovaikutteinen kuori
Vastaa
-s
ei tee sinun kuori interaktiivinen. Käytä sen sijaan -i
.