Opțiuni bash și shell-uri interactive

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *