Bash-alternativer og interaktive skall

Alternativet -s å bash ser ikke ut til å virkelig gjøre noe

Når jeg utfører kommandoer med eller uten det forandres ingenting. Det som virkelig forvirrer meg er når jeg utfører et skallskript, ser det ut til at jeg alltid får et interaktivt skall. Jeg antar at det er interaktivt, for når jeg bruker den innebygde lesingen i skriptet vil det alltid be meg gjør dette interaktivt?

Kjører shell-skript som interaktivt i fedora, og er det noen eksempler på en forskjell som -s kan gjøre? Jeg har lest mansidene, men kan ikke ser ut til å generere eksempler på egenhånd som kan ha noen effekt. Jeg kombinerte de to spørsmålene fordi jeg prøvde å bruke s for å endre hvordan skriptet mottok innspill, og i noen veiledninger sier de at det har en effekt. Jeg skjønner at det kan sette argumenter, det jeg ikke får er hvordan det endrer det å lese fra standardinngang, det ser alltid ut til å gjøre det uansett

Her er hva jeg pleide å teste det

if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY 

read var alltid i stand til å jobbe i både ikke-interaktive skall

Selv når jeg testet for tilstedeværelse av fd / 0 og fd / 1 i ikke-interaktive skall de fortsatt eksisterte

Takk på forhånd

Svar

Bash vil også avgjøre om eller ikke er det interaktivt ved å undersøke om inngangen / utgangen er koblet til en terminal.

-s ikke-interaktiv bryter lar bash-skriptet behandle posisjonsparametere når lese kommandoer fra en fil, f.eks.

$ 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 

Svar

-s alternativet får bash til å lese kommandoer fra standardinngangen. Uten dette alternativet behandler bash sitt første argument som navnet på et skript som skal utføres. Med dette alternativ, bash behandler alle argumentene som argumenter for skriptet som den leser på standardinndata. -s alternativet bestemmer bare hvordan bash tolker kommandolinjeargumentene, ikke om skallforekomsten er interaktiv.

En forekomst av bash er alltid interaktiv hvis den startes med alternativet -i. Uten -i er det bare interaktivt hvis ikke noe skriptnavn sendes (-s påvirker dette) og både standardinngang og standardfeil er koblet til en terminal.

Testing PS1 forteller deg ikke om en skallforekomst er interaktiv. ¹ Du kan slå av PS1 i et interaktivt skall. Omvendt arver et ikke-interaktivt skall ofte PS1 fra omgivelsene. Den pålitelige måten å teste om skallet kjører interaktivt, er å teste om $- inneholder i.

read innebygd fungerer fra et hvilket som helst skall, interaktivt eller ikke. Den leser fra hva som helst som er koblet til skallets standardinngang (med mindre det blir omdirigert). Hvis du prøver å lese fra samme filbeskrivelse der bash leser skriptet det kjøres, vil du ende opp med å hoppe over en linje i skriptet (ikke nødvendigvis på det stedet du hadde tenkt deg) Hvis du for eksempel sender et skript på bashs standardinngang og du vil lese en linje fra terminalen, må du omdirigere read call: read line </dev/tty.

Filbeskrivelser 0, 1 og 2 eksisterer alltid (med mindre de har blitt lukket); de er henholdsvis standardinngang, standardutgang og standardfeil. Hvorvidt skallet er interaktivt eller ikke er ikke relatert til hva standardbeskrivelsene peker på, bortsett fra at om fd 0 og 2 er terminaler, påvirker skallets interaktive status.

¹ Ja, jeg er m klar over at det er websider som hevder dette. De har feil.

Svar

Litt mer informasjon om interaktive skall:

Du kan finne ut om et skall er interaktivt eller ikke ved å sjekke $-. Hvis $- inneholder en i, så er skallet interaktivt.

Et skall er interaktivt når det leser inngangen fra brukeren direkte. Et ikke-interaktivt skall leser kommandoer fra en fil linje for linje og utfører dem. gjør ikke skallet interaktivt når du leser noe fra stdin fra skriptet, da «skriptet leser inndata, ikke skallet» (vet ikke hvordan du skal forklare dette bedre).

 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 

Kommentarer

  • Det som var forvirrende er i dokumentasjonen for bash, de sier at den vil henge hvis du bruker lese i en ikke – interaktivt skall

Svar

-s gjør ikke ditt skall interaktivt. Bruk -i i stedet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *