Bash-alternativ och interaktiva skal

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *