Jak mogę powiedzieć (in ~/.bashrc
), czy działam w trybie interaktywnym lub, powiedzmy, wykonując polecenie przez ssh. Chcę uniknąć drukowania sekwencji ucieczki ANSI, .bashrc
jeś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, .bashrc
jeś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ą.
~/.bashrc
Jest więc pozyskiwany tylko dla interaktywnych powłok. Czasami ludzie ją pozyskują ~/.bash_profile
lub ~/.profile
jest 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 rc
plików logowania , takich jak ~/.bash_profile
lub, ~/.profile
ponieważ może to zakłócać rsync
na 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_profile
lub ~/.profile
jest on niepoprawny, ponieważ koliduje z oczekiwanym zachowaniem . Co sądzisz o zaopatrywaniu ~/.bashrc
od ~/.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
test
narzę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”.