Bash-asetukset ja vuorovaikutteiset kuoret

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.

Vastaa

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