Opțiunea -s pentru bash nu pare să facă cu adevărat nimic
Când execut comenzi cu sau fără el nimic nu se schimbă. Ceea ce mă încurcă cu adevărat este că atunci când execut un script de shell parcă primesc întotdeauna un shell interactiv. Îmi presupun că este interactiv, deoarece atunci când folosesc citirea integrată în script, mă va cere întotdeauna pentru input. Îl face interactiv?
Scriptul shell rulează ca interactiv în fedora și există exemple de diferență pe care -s le poate face? Am citit paginile man, dar nu pot par să genereze exemple pe cont propriu care ar avea vreun efect. Am combinat cele două întrebări pentru că încercam să folosesc s pentru a schimba modul în care a primit input-ul scriptului, iar în unele tutoriale se spune că are efect. Îmi dau seama că poate seta argumente, ceea ce nu primesc este modul în care îl modifică pentru a citi din intrarea standard, pare să facă asta oricum
Iată ce am folosit pentru a-l testa
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
read a fost întotdeauna capabil să funcționeze atât în shell-uri non-interactive, cât și în shell-uri interactive
Chiar și când am testat prezența fd / 0 și fd / 1 în shell-uri non-interactive au existat încă
Vă mulțumim anticipat
Răspundeți
Bash va determina, de asemenea, dacă sau nu este interactiv, examinând dacă intrarea / ieșirea acestuia sunt atașate la un terminal.
Comutatorul non-interactiv -s
permite scriptului bash să proceseze parametrii poziționali atunci când citirea comenzilor dintr-un fișier. de exemplu:
$ 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
Răspuns
-s
face ca bash să citească comenzile din intrarea sa standard. Fără această opțiune, bash tratează primul său argument ca numele unui script de executat. Cu aceasta opțiune, bash tratează toate argumentele sale ca argumente pentru scriptul pe care îl citește pe intrarea standard. Opțiunea -s
determină doar modul în care bash își interpretează argumentele din linia de comandă, nu dacă instanța shell este interactivă.
O instanță a lui bash este întotdeauna interactivă dacă este pornită cu opțiunea -i
. Fără -i
, este interactiv numai dacă nu este trecut un nume de script (-s
influențează acest lucru) și atât intrarea standard, cât și eroarea standard sunt conectate la un terminal.
Testarea PS1
nu vă spune dacă o instanță shell este interactivă. Puteți anula PS1
într-o coajă interactivă. În schimb, un shell non-interactiv moștenește adesea PS1
din mediul său. Modul fiabil de a testa dacă shell-ul rulează interactiv este de a testa dacă $-
conține i
.
div id = „7f35936f21″>
builtin funcționează din orice shell, interactiv sau nu. Se citește din orice este conectat la intrarea standard a shell-ului (cu excepția cazului în care este redirecționat). Dacă încercați să citiți din același descriptor de fișier în care bash citește scriptul pe care îl execută, veți ajunge să omiteți o linie în script (nu neapărat în locul pe care l-ați intenționat); de exemplu, dacă „treceți un script la intrarea standard a lui bash și doriți să citiți o linie de la terminal, trebuie să redirecționați read
call: read line </dev/tty
.
Descriptorii de fișiere 0, 1 și 2 există întotdeauna (cu excepția cazului în care „au fost închise); sunt intrare standard, ieșire standard și, respectiv, eroare standard. Indiferent dacă shell-ul este interactiv sau nu, nu are legătură cu ceea ce indică descriptorii standard, cu excepția faptului că fd 0 și 2 sunt terminale influențează starea interactivă a shell-ului.
¹ Da, eu „m conștient că există pagini web care susțin acest lucru. „Greșesc.
Răspunde
Puțin mai multe informații despre shell-urile interactive:
Puteți afla dacă un shell este interactiv sau nu bifând $-
. Dacă $-
conține un i
, apoi shell-ul este interactiv.
Un shell este interactiv atunci când citește direct intrarea de la utilizator. Un shell non-interactiv citește comenzile dintr-un fișier linie cu linie și le execută. nu face shell-ul interactiv atunci când citește ceva din stdin din script, deoarece „scriptul citește intrarea, nu shell-ul” (nu știu cum să explic acest lucru mai bine).
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
Comentarii
- Ceea ce a fost confuz este că în documentația pentru bash se spune că se va bloca dacă utilizați citire într-un non – shell interactiv
Răspuns
-s
nu vă face shell interactiv. Folosiți în schimb -i
.