Jak mogę powiedzieć (in ~/.bashrc), czy działam w trybie interaktywnym lub, powiedzmy, wykonując polecenie przez ssh. Chcę uniknąć drukowania sekwencji ucieczki ANSI, .bashrcjeśli to ta ostatnia.
Jak mogę powiedzieć (in ~/.bashrc), czy działam w trybie interaktywnym lub, powiedzmy, wykonując polecenie przez ssh. Chcę uniknąć drukowania sekwencji ucieczki ANSI, .bashrcjeśli to ta ostatnia.
Odpowiedzi:
Według man bash:
PS1 jest ustawione, a $ - obejmuje i, jeśli bash jest interaktywny, pozwalając skryptowi powłoki lub plikowi startowemu przetestować ten stan.
Możesz więc użyć:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Również:
Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z /etc/bash.bashrc i ~ / .bashrc, jeśli te pliki istnieją.
~/.bashrcJest więc pozyskiwany tylko dla interaktywnych powłok. Czasami ludzie ją pozyskują ~/.bash_profilelub ~/.profilejest ona niepoprawna, ponieważ przeszkadza w oczekiwanym zachowaniu. Jeśli chcesz uprościć obsługę wspólnego kodu, powinieneś użyć osobnego pliku, aby zawrzeć wspólny kod i uzyskać go niezależnie od obu plików rc.
Najlepiej, jeśli nie ma wyjścia do wyjścia z rcplików logowania , takich jak ~/.bash_profilelub, ~/.profileponieważ może to zakłócać rsyncna przykład prawidłowe działanie .
W każdym razie dobrym pomysłem jest przetestowanie interaktywności, ponieważ może istnieć niepoprawna konfiguracja.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profilelub ~/.profilejest on niepoprawny, ponieważ koliduje z oczekiwanym zachowaniem . Co sądzisz o zaopatrywaniu ~/.bashrcod ~/.bash_login? Ponieważ powłoka logowania nie musi być interaktywna, wydaje mi się, że jest również niepoprawna.
Posługiwać się:
if tty -s; then echo interactive; fi
testnarzędzie może to sprawdzić (od strony man):
-t FD True if FD is opened on a terminal.
Możesz więc użyć na przykład:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
lub
if [ -t 1 ] ; then
echo stdout is a terminal
fi
bash <<< 'test -t 0 && echo Y || echo X'pisze Y, bash -c 'test -t 0 && echo Y || echo X'piszeX
Zwykle patrzę na wynik programu tty.
Jeśli jesteś na tty, powie ci, na którym ty jesteś. Jeśli nie jesteś w trybie interaktywnym, zwykle powie ci coś w stylu „nie tty”.