Lopzione -s di bash non sembra fare davvero nulla
Quando eseguo comandi con o senza di essa non cambia nulla. Ciò che mi confonde veramente è che quando eseguo uno script di shell mi sembra sempre di ottenere una shell interattiva. Presumo che sia interattiva perché quando uso il builtin di lettura nello script mi verrà sempre chiesto input. Questo lo rende interattivo?
Lo script di shell viene eseguito come interattivo in fedora e ci sono esempi di una differenza che può fare -s? Ho letto le pagine man, ma non posso “t sembrano generare esempi da solo che avrebbero alcun effetto. Ho combinato le due domande perché stavo cercando di usare s per cambiare il modo in cui lo script ha ricevuto input, e in alcuni tutorial dicono che ha un effetto. Mi rendo conto che può impostare argomenti, quello che non capisco è come lo cambia per leggere dallo standard input sembra sempre farlo comunque
Ecco cosa ho usato per testarlo
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
read è sempre stato in grado di funzionare sia in shell non che interattive
Anche quando ho testato la presenza di fd / 0 e fd / 1 in shell non interattive esistevano ancora
Grazie in anticipo
Risposta
Bash determinerà anche se o non è interattivo esaminando se il suo input / output è collegato a un terminale.
Lo switch -s
non interattivo consente allo script bash di elaborare parametri posizionali quando leggere i comandi da un file, ad esempio:
$ 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
Answer
Il -s
lopzione fa in modo che bash legga i comandi dal suo standard input. Senza questa opzione, bash tratta il suo primo argomento come il nome di uno script da eseguire. Con questo opzione, bash tratta tutti i suoi argomenti come argomenti per lo script che legge sullo standard input. Lopzione -s
determina solo come bash interpreta i suoi argomenti della riga di comando, non se listanza della shell è interattiva.
Unistanza di bash è sempre interattiva se viene avviata con lopzione -i
. Senza -i
, è interattivo solo se non viene passato alcun nome di script (-s
lo influenza) e sia lo standard input che lo standard error sono collegati a un terminale.
Testare PS1
non ti dice se unistanza di shell è interattiva.¹ Puoi annullare limpostazione PS1
in una shell interattiva. Al contrario, una shell non interattiva spesso eredita PS1
dal suo ambiente. Il modo affidabile per verificare se la shell è in esecuzione in modo interattivo è verificare se $-
contiene i
.
Il read
builtin funziona da qualsiasi shell, interattiva o meno. Legge da tutto ciò che è connesso allo standard input della shell (a meno che non venga reindirizzato). Se provi a leggere dallo stesso descrittore di file in cui bash sta leggendo lo script che sta eseguendo, finirai per saltare una riga nello script (non necessariamente nel luogo desiderato); ad esempio, se “stai passando uno script sullinput standard di bash” e desideri leggere una riga dal terminale, devi reindirizzare il read
chiama: read line </dev/tty
.
I descrittori di file 0, 1 e 2 esistono sempre (a meno che non siano stati chiusi); sono rispettivamente standard input, standard output e standard error. Il fatto che la shell sia interattiva o meno non è correlato a ciò a cui puntano i descrittori standard, tranne che se fd 0 e 2 sono terminali influenza lo stato interattivo della shell.
¹ Sì, io “m consapevole che ci sono pagine web che lo affermano. Si “sbagliano.
Risposta
Qualche informazione in più sulle shell interattive:
Puoi scoprire se una shell è interattiva o meno selezionando $-
. Se $-
contiene un i
, la shell è interattiva.
Una shell è interattiva quando legge linput dellutente direttamente. Una shell non interattiva legge i comandi da un file riga per riga e li esegue. non rende la shell interattiva quando legge qualcosa dallo stdin dallinterno dello script, poiché “lo script legge linput, non la shell” (non so come spiegarlo meglio).
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
Commenti
- Ciò che era fonte di confusione è nella documentazione di bash dicono che si bloccherà se usi read in un non – shell interattiva
Risposta
-s
non “fa il tuo shell interattiva. Utilizza invece -i
.