Alternativet -s att bash verkar inte göra någonting
När jag kör kommandon med eller utan det förändras ingenting. Det som verkligen förvirrar mig är när jag kör ett skalskript verkar jag alltid få ett interaktivt skal. Jag antar att det är interaktivt, för när jag använder den inbyggda läsningen i skriptet kommer det alltid att be mig om gör detta det interaktivt?
Kör shell-skript som interaktiva i fedora, och finns det några exempel på skillnader som -s kan göra? Jag har läst man-sidorna, men kan inte verkar generera några exempel på egen hand som skulle ha någon effekt. Jag kombinerade de två frågorna för att jag försökte använda s för att ändra hur skriptet fick input, och i vissa handledning säger de att det har en effekt. Jag inser att det kan ställa in argument, vad jag inte får är hur det ändrar det att läsa från standardinmatning det verkar alltid göra det ändå
Här är vad jag brukade testa det
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
läsning kunde alltid fungera i både icke-interaktiva skal
Även när jag testade för förekomst av fd / 0 och fd / 1 i icke-interaktiva skal de fanns fortfarande
Tack på förhand
Svar
Bash kommer också att avgöra om eller inte det är interaktivt genom att undersöka om dess ingång / utgång är kopplad till en terminal.
-s
icke-interaktiv switch gör att bash-skriptet kan bearbeta positionsparametrar när läsa kommandon från en fil. t.ex.:
$ 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 gör att bash läser kommandon från sin standardingång. Utan detta alternativ behandlar bash sitt första argument som namnet på ett skript som ska köras. Med detta alternativ behandlar bash alla sina argument som argument till skriptet som den läser vid standardinmatning. Alternativet -s
avgör bara hur bash tolkar sina kommandoradsargument, inte om skalinstansen är interaktiv.
En instans av bash är alltid interaktiv om den startas med alternativet -i
. Utan -i
är det bara interaktivt om inget skriptnamn skickas (-s
påverkar detta) och både standardingång och standardfel är anslutna till en terminal.
Att testa PS1
säger inte om en shellinstans är interaktiv. ¹ Du kan avmarkera PS1
i ett interaktivt skal. Omvänt ärver ett icke-interaktivt skal ofta PS1
från sin miljö. Det pålitliga sättet att testa om skalet körs interaktivt är att testa om $-
innehåller i
.
read
inbyggt fungerar från vilket skal som helst, interaktivt eller inte. Den läser från vad som helst som är anslutet till skalets standardingång (såvida det inte omdirigeras). Om du försöker läsa från samma filbeskrivare där bash läser skriptet som det körs, kommer du att hoppa över en rad i skriptet (inte nödvändigtvis på den plats du tänkt). Om du till exempel skickar ett skript till bashs standardinmatning och vill läsa en rad från terminalen måste du omdirigera read
call: read line </dev/tty
.
Filbeskrivare 0, 1 och 2 finns alltid (såvida de inte har stängts); de är standardingång, standardutgång respektive standardfel. Huruvida skalet är interaktivt eller inte är inte relaterat till vad standardbeskrivarna pekar på, förutom att om fd 0 och 2 är terminaler påverkar skalets interaktiva status.
¹ Ja, jag ”m medveten om att det finns webbsidor som hävdar detta. De har ”fel.
Svar
Lite mer information om interaktiva skal:
Du kan ta reda på om ett skal är interaktivt eller inte genom att markera $-
. Om $-
innehåller en i
, då är skalet interaktivt.
Ett skal är interaktivt när det läser inmatningen från användaren direkt. Ett icke-interaktivt skal läser kommandon från en fil rad för rad och kör dem. gör inte skalet interaktivt när du läser något från stdin inifrån skriptet, eftersom ”skriptet läser inmatningen, inte skalet” (vet inte hur man förklarar detta bättre).
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 förvirrande är i dokumentationen för bash de säger att den kommer att hänga om du använder läs i en icke – interaktivt skal
Svar
-s
gör inte ditt skal interaktiv. Använd istället -i
.