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.