De -s-optie om te bash lijkt “niet echt iets te doen
Wanneer ik opdrachten uitvoer met of zonder dit verandert er niets. Wat me echt in de war brengt, is dat wanneer ik een shell-script uitvoer, ik altijd een interactieve shell krijg. Ik ga ervan uit dat het interactief is, want als ik de ingebouwde read in het script gebruik, wordt er altijd om input. Maakt dit het interactief?
Draait het shellscript als interactief in fedora, en zijn er voorbeelden van een verschil dat de -s kunnen maken? Ik heb de manpages gelezen, maar kan “t lijken zelf voorbeelden te genereren die enig effect zouden hebben. Ik heb de twee vragen gecombineerd omdat ik s probeerde te gebruiken om te veranderen hoe het script input ontving, en in sommige tutorials zeggen ze dat het effect heeft. Ik realiseer me dat het argumenten kan instellen, wat ik niet begrijp is hoe het het verandert om te lezen van standaardinvoer, het lijkt dat toch altijd te doen
Hier is wat ik gebruikte om het te testen
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
read was altijd in staat om te werken in zowel niet- als interactieve shells
Zelfs toen ik testte op de aanwezigheid van fd / 0 en fd / 1 in niet-interactieve shells ze bestonden nog
Bij voorbaat dank
Answer
Bash zal ook bepalen of niet, het is interactief door te onderzoeken of de invoer / uitvoer ervan is verbonden met een terminal.
Met de -s
niet-interactieve schakelaar kan het bash-script positionele parameters verwerken wanneer opdrachten uit een bestand lezen. bijv .:
$ 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
Antwoord
De -s
optie zorgt ervoor dat bash commandos van zijn standaardinvoer leest. Zonder deze optie behandelt bash zijn eerste argument als de naam van een uit te voeren script. optie, behandelt bash al zijn argumenten als argumenten voor het script dat het leest bij standaardinvoer. De optie -s
bepaalt alleen hoe bash zijn opdrachtregelargumenten interpreteert, niet of de shell-instantie interactief is.
Een instantie van bash is altijd interactief als deze wordt gestart met de -i
optie. Zonder -i
is het alleen interactief als er geen scriptnaam wordt doorgegeven (-s
beïnvloedt dit) en zowel standaardinvoer als standaardfout zijn verbonden met een terminal.
Testen van PS1
vertelt je niet of een shell-instantie interactief is. ¹ Je kunt PS1
uitschakelen in een interactieve schil. Omgekeerd erft een niet-interactieve shell vaak PS1
van zijn omgeving. De betrouwbare manier om te testen of de shell interactief draait, is door te testen of $-
i
bevat.
De read
ingebouwd werkt vanuit elke shell, interactief of niet. Het leest van alles wat is aangesloten op de standaardinvoer van de shell (tenzij het wordt omgeleid). Als je probeert te lezen uit dezelfde bestandsdescriptor waar bash het script leest dat het uitvoert, zul je uiteindelijk een regel in het script overslaan (niet noodzakelijkerwijs op de plaats die u bedoelde); als u bijvoorbeeld “een script doorgeeft aan de standaardinvoer van bash” en u een regel van de terminal wilt lezen, moet u de read
call: read line </dev/tty
.
Bestandsbeschrijvingen 0, 1 en 2 bestaan altijd (tenzij ze zijn gesloten); dit zijn respectievelijk standaardinvoer, standaarduitvoer en standaardfout. Of de shell interactief is of niet, heeft niets te maken met waar de standaarddescriptors naar verwijzen, behalve dat of fd 0 en 2 terminals zijn, de interactieve status van de shell beïnvloedt.
¹ Ja, ik m weet dat er webpaginas zijn die dit beweren. Ze hebben het mis.
Antwoord
Wat meer informatie over interactieve shells:
Je kunt zien of een shell interactief is of niet door $-
te controleren. Als $-
een i
, dan is de shell interactief.
Een shell is interactief wanneer hij de invoer van de gebruiker rechtstreeks leest. Een niet-interactieve shell leest commandos regel voor regel uit een bestand en voert ze uit. maakt de shell niet interactief bij het lezen van iets van stdin vanuit het script, aangezien “het script de invoer leest, niet de shell” (weet niet hoe ik dit beter moet uitleggen).
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
Reacties
- Wat verwarrend was, is dat in de documentatie voor bash ze zeggen dat het vastloopt als je read in een niet – interactieve shell
Answer
-s
maakt uw shell interactief. Gebruik in plaats daarvan -i
.