Bash opciók és interaktív héjak

A -s bas opció úgy tűnik, nem igazán csinál semmit

Amikor parancsokat hajtok végre a anélkül semmi sem változik. Ami engem igazán zavar, amikor egy shell szkriptet futtatok, úgy tűnik, mindig interaktív shell-t kapok. Feltételezem, hogy interaktív, mert amikor a beépített read-t használom a szkriptben, mindig arra késztet, hogy input. Ez interaktívvá teszi?

A shell script interaktív módon fut a fedora-ban, és van-e példa arra, hogy az -s különbségeket hozhat létre? Olvastam a man oldalakat, de nem tudok ” úgy tűnik, hogy olyan példákat generálok egyedül, amelyeknek bármilyen hatása lenne. Kombináltam a két kérdést, mert az s segítségével próbáltam megváltoztatni, hogy a szkript hogyan fogadja a bemenetet, és egyes oktatóanyagok szerint azt mondják, hogy hatása van. Tudomásul veszem, hogy argumentumokat állíthat be, amit nem kapok meg, hogyan változtatja meg, hogy a szabványos bemenetről olvassa el, úgy tűnik, hogy mindig ezt teszi

if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY 

az read mindig képes volt mind nem interaktív, mind interaktív héjakban dolgozni

Akkor is, ha teszteltem az fd / 0 és az fd / 1 jelenlétét a nem interaktív héjak még mindig léteztek

Előre is köszönöm

Válasz

A Bash azt is meghatározza, hogy nem interaktív, ha megvizsgálja, hogy a bemenete / kimenete csatlakozik-e egy terminálhoz.

A -s nem interaktív kapcsoló lehetővé teszi a bash szkript számára a helyzeti paraméterek feldolgozását, amikor parancsok olvasása fájlból. Pl .:

$ 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 

Válasz

A -s opció miatt a bash parancsokat olvas be a szokásos bemenetéből. Ennél az opciónál a bash az első argumentumát egy végrehajtandó szkript neveként kezeli. opció, a bash az összes argumentumát argumentumként kezeli a szkript számára, amelyet a szokásos bemeneten olvas. A -s opció csak azt határozza meg, hogy a bash hogyan értelmezi a parancssori argumentumait, nem pedig azt, hogy a shell-példány interaktív-e.

A bash példánya mindig interaktív, ha elindul a -i opcióval. -i nélkül csak akkor interaktív, ha egyetlen szkriptnév sem kerül átadásra (-s befolyásolja ezt), és mind a standard bemenet, mind a standard hiba csatlakozik terminál.

A PS1 tesztelés nem adja meg, hogy a héjpéldány interaktív-e. ¹ Beállíthatja a PS1 interaktív héjban. Ezzel szemben egy nem interaktív héj gyakran örökli a környezetéből az PS1 -t. A shell interaktív futásának tesztelésének megbízható módja annak tesztelése, hogy a $- tartalmaz-e i.

A read a beépített bármilyen héjból működik, akár interaktív, akár nem. Bárhonnan olvasható, amely a shell szabványos bemenetéhez van csatlakoztatva (hacsak nem irányítják át). Ha ugyanabból a fájlleíróból próbál olvasni, ahol a bash a végrehajtott szkriptet olvassa, akkor végül kihagy egy sort a szkriptben (nem feltétlenül a kívánt helyen); például, ha egy szkriptet ad át a bash szabványos bemenetén, és egy sort akar olvasni a terminálról, át kell irányítania a read hívás: read line </dev/tty.

A 0., 1. és 2. fájlleírók mindig léteznek (hacsak nincsenek bezárva); ezek szokásos bemenet, standard kimenet és szokásos hiba. Az, hogy a héj interaktív-e vagy sem, nem függ attól, amit a szokásos leírók mutatnak, azzal a különbséggel, hogy az fd 0 és 2 terminálok befolyásolják-e a héj interaktív állapotát.

¹ Igen, I “m tudatában annak, hogy vannak olyan weboldalak, amelyek ezt állítják. Tévednek.

Válasz

Még egy kis információ az interaktív héjakról:

A $- ellenőrzésével megtudhatja, hogy a shell interaktív-e vagy sem. Ha a $- tartalmaz egy i, akkor a héj interaktív.

A héj interaktív, ha közvetlenül a felhasználó bemenetét olvassa. A nem interaktív héj soronként olvassa fel a fájlokat és végrehajtja azokat. nem teszi interaktívvá a héjat, ha bármit olvas a stdin-ről a szkripten belül, mivel “a szkript a bemenetet olvassa, nem a shell” (ezt nem tudja jobban megmagyarázni).

 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 

Megjegyzések

  • Ami zavaró, az szerepel a bash dokumentációjában, azt mondják, hogy lógni fog, ha nem olvasott nyelvet használ interaktív shell

Válasz

-s nem teszi héj interaktív. Használja helyette az -i szót.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük