Opcje Bash i powłoki interaktywne

Opcja -s w bash nie wydaje się robić nic

Kiedy wykonuję polecenia z lub bez niego nic się nie zmienia. To, co naprawdę mnie wprawia w zakłopotanie, to to, że kiedy wykonuję skrypt powłoki, zawsze wydaje mi się, że otrzymuję interaktywną powłokę. Zakładam, że jest to interaktywne, ponieważ kiedy używam wbudowanego odczytu w skrypcie, zawsze zapyta Czy to czyni go interaktywnym?

Czy skrypt powłoki działa jako interaktywny w Fedorze i czy są jakieś przykłady różnic, które mogą wprowadzić -s? Przeczytałem strony podręcznika, ale nie mogę wydają się generować własne przykłady, które miałyby jakikolwiek skutek. Połączyłem te dwa pytania, ponieważ próbowałem użyć s, aby zmienić sposób, w jaki skrypt otrzymywał dane wejściowe, aw niektórych tutorialach mówią, że ma to wpływ. Zdaję sobie sprawę, że może ustawiać argumenty, ale nie dostaję tego, jak zmienia to, aby czytać ze standardowego wejścia, i tak zawsze wydaje się, że tak robi

Oto, czego użyłem do przetestowania tego

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

read zawsze działało w powłokach nieinteraktywnych i nieinteraktywnych

Nawet gdy testowałem obecność fd / 0 i fd / 1 w powłoki nieinteraktywne nadal istniały

Z góry dziękuję

Odpowiedź

Bash określi również, czy nie jest interaktywny, sprawdzając, czy jego wejście / wyjście jest podłączone do terminala.

Przełącznik nieinteraktywny -s pozwala skryptowi bash na przetwarzanie parametrów pozycyjnych, gdy odczytywanie poleceń z pliku. np .:

$ 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 

Odpowiedź

-s powoduje, że bash czyta polecenia ze swojego standardowego wejścia. Bez tej opcji bash traktuje pierwszy argument jako nazwę skryptu do wykonania. opcja, bash traktuje wszystkie swoje argumenty jako argumenty skryptu, który czyta ze standardowego wejścia. Opcja -s określa tylko, w jaki sposób bash interpretuje argumenty wiersza poleceń, a nie określa, czy instancja powłoki jest interaktywna.

Instancja bash jest zawsze interaktywna, jeśli jest uruchomiona z opcją -i. Bez -i jest on interaktywny tylko wtedy, gdy nie zostanie przekazana żadna nazwa skryptu (-s ma na to wpływ) i podłączone są zarówno standardowe wejście, jak i standardowy błąd terminal.

Testowanie PS1 nie mówi, czy instancja powłoki jest interaktywna.¹ Możesz wyłączyć PS1 w interaktywnej powłoce. I odwrotnie, powłoka nieinteraktywna często dziedziczy PS1 ze swojego środowiska. Wiarygodnym sposobem sprawdzenia, czy powłoka działa interaktywnie, jest sprawdzenie, czy $- zawiera i.

Element read wbudowany działa z dowolnej powłoki, interaktywnej lub nie. Czyta z wszystkiego, co jest podłączone do standardowego wejścia powłoki (chyba że zostanie przekierowane). Jeśli spróbujesz czytać z tego samego deskryptora pliku, w którym bash czyta skrypt, który wykonuje, w końcu pominiesz wiersz w skrypcie (niekoniecznie w miejscu, które zamierzałeś); na przykład, jeśli przekazujesz skrypt na standardowe wejście basha i chcesz odczytać wiersz z terminala, musisz przekierować read call: read line </dev/tty.

Deskryptory plików 0, 1 i 2 zawsze istnieją (chyba że zostały zamknięte); są to odpowiednio standardowe wejście, standardowe wyjście i standardowe błędy. To, czy powłoka jest interaktywna, czy nie, nie jest związane z tym, na co wskazują standardowe deskryptory, z wyjątkiem tego, że to, czy fd 0 i 2 są terminalami, wpływa na interaktywny status powłoki.

¹ Tak, ja świadomy, że istnieją strony internetowe, które tak twierdzą. Oni „mylą się.

Odpowiedź

Trochę więcej informacji o powłokach interaktywnych:

Możesz dowiedzieć się, czy powłoka jest interaktywna, czy nie, sprawdzając $-. Jeśli $- zawiera i, to powłoka jest interaktywna.

Powłoka jest interaktywna, gdy odczytuje dane wejściowe bezpośrednio od użytkownika. Powłoka nieinteraktywna odczytuje polecenia z pliku wiersz po wierszu i wykonuje je. nie czyni powłoki interaktywną podczas odczytywania czegokolwiek ze standardowego wejścia z poziomu skryptu, ponieważ „skrypt czyta dane wejściowe, a nie powłokę” (nie wiem, jak lepiej to wyjaśnić).

 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 

Komentarze

  • Zagmatwane jest to, że w dokumentacji basha mówią, że zawiesi się, jeśli użyjesz odczytu w języku innym niż interaktywna powłoka

Odpowiedź

-s nie sprawia, że powłoka interaktywna. Zamiast tego użyj -i.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *