Muligheden -s for at bash ser ikke ud til at gøre noget
Når jeg udfører kommandoer med eller uden det ændres intet. Det, der virkelig forvirrer mig, er når jeg udfører et shell-script, ser jeg altid ud til at få en interaktiv shell. Jeg antager, at det er interaktiv, for når jeg bruger den indbyggede læse i scriptet, vil det altid bede mig om gør det det interaktivt?
Kører shell-script som interaktivt i fedora, og er der eksempler på en forskel, som -s kan gøre? Jeg har læst mandsiderne, men kan ikke ser ud til at generere eksempler på egen hånd, der ville have nogen effekt. Jeg kombinerede de to spørgsmål, fordi jeg prøvede at bruge s til at ændre, hvordan scriptet modtog input, og i nogle tutorials siger de, at det har en effekt. Jeg er klar over, at det kan indstille argumenter, hvad jeg ikke får, er, hvordan det ændrer det til at læse fra standardinput, det ser altid ud til at gøre det alligevel
Her er hvad jeg plejede at teste det
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
læste var altid i stand til at arbejde i både ikke-interaktive skaller
Selv når jeg testede for tilstedeværelsen af fd / 0 og fd / 1 i ikke-interaktive skaller, de eksisterede stadig
På forhånd tak
Svar
Bash vil også afgøre, om eller ikke er det interaktivt ved at undersøge, om dets input / output er knyttet til en terminal.
-s
ikke-interaktiv switch giver bash-scriptet mulighed for at behandle positionsparametre, når læsningskommandoer 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
indstilling får bash til at læse kommandoer fra sin standardindgang. Uden denne mulighed behandler bash sit første argument som navnet på et script, der skal udføres. Med dette option, bash behandler alle sine argumenter som argumenter til scriptet, som det læser på standardinput. Indstillingen -s
bestemmer kun, hvordan bash fortolker sine kommandolinjeargumenter, ikke om shellinstansen er interaktiv.
En bash-forekomst er altid interaktiv, hvis den startes med indstillingen -i
. Uden -i
er det kun interaktivt, hvis der ikke sendes noget scriptnavn (-s
påvirker dette), og både standardinput og standardfejl er forbundet til en terminal.
Testning PS1
fortæller dig ikke, om en shellinstans er interaktiv. ¹ Du kan frakoble PS1
i en interaktiv skal. Omvendt arver en ikke-interaktiv shell ofte PS1
fra sit miljø. Den pålidelige måde at teste, om skallen kører interaktivt, er at teste, om $-
indeholder i
.
read
indbygget fungerer fra enhver shell, interaktiv eller ej. Den læser fra det, der er forbundet til shellens standardinput (medmindre det omdirigeres). Hvis du forsøger at læse fra den samme filbeskrivelse, hvor bash læser scriptet, som det udføres, vil du ende med at springe over en linje i scriptet (ikke nødvendigvis på det sted, du har tænkt dig). Hvis du f.eks. videresender et script til bashs standardindgang, og du vil læse en linje fra terminalen, skal du omdirigere read
kald: read line </dev/tty
.
Filbeskrivelser 0, 1 og 2 findes altid (medmindre de er blevet lukket); de er henholdsvis standardindgang, standardoutput og standardfejl. Om skallen er interaktiv eller ej er ikke relateret til, hvad standardbeskrivelserne peger på, bortset fra at hvorvidt fd 0 og 2 er terminaler, påvirker shellens interaktive status.
¹ Ja, jeg “m opmærksom på, at der er websider, der hævder dette. De “tager fejl.
Svar
Lidt mere information om interaktive skaller:
Du kan finde ud af, om en shell er interaktiv eller ej ved at markere $-
. Hvis $-
indeholder en i
, så er skallen interaktiv.
En skal er interaktiv, når den læser input fra brugeren direkte. En ikke-interaktiv skal læser kommandoer fra en fil linje for linje og udfører dem. gør ikke skallen interaktiv, når man læser noget fra stdin fra scriptet, da “scriptet læser input, ikke shell” (ved ikke, hvordan man forklarer 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
- Hvad der var forvirrende er i dokumentationen til bash, de siger, at den vil hænge, hvis du bruger læst i en ikke – interaktiv shell
Svar
-s
gør ikke din skal interaktiv. Brug -i
i stedet.