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.