Mam skrypt Bash, który próbowałem wykonać, aby pomóc mi uruchomić dość złożone polecenie z małymi zmianami, o które zapytałby mnie przez echo i przeczytał.
Znalazłem rozwiązania, które zmuszają go do uruchomienia terminala w celu wykonania polecenia, ale nie jestem tym zainteresowany. Chciałbym to zrobić, jeśli zwolnię miejsce i po prostu naciśniesz Enter na nim w Nautilusie (uruchamiając go z Run Software), po prostu delikatnie wyświetli powiadomienie z informacją: „Uruchom to z terminala”.
Mogę wywołać wyskakujące okienko - tak jak w przypadku polecenia - ale nie mogę uzyskać skryptu Bash z informacją, czy jest uruchamiany w terminalu, czy nie, wydaje się, że zawsze tak jest. Czy to w ogóle możliwe?
||
czegoś[ … ]
takiego? Jeśli użyjesz[[ … ]]
, będzie dobrze, ale zwykle||
służy do oddzielania poleceń i[ -t 0
jest niepoprawnym wywołaniem,[
ponieważ]
brakuje jego ostatniego . Zazwyczaj nie ma też polecenia-p
. Zgadzam się z testowaniem terminala; to prawdopodobnie sposób na zrobienie tego. Martwię się tylko o składnię.||
jest wyświetlany przed wymaganym ostatecznym]
argumentem do[
.PS1
nie jest wiarygodnym testem pozwalającym stwierdzić, czy powłoka jest interaktywna. „Jeśli skrypt musi przetestować, czy działa w powłoce interaktywnej”, jest również mylący: powinien być, jeśli jakiś kod wymaga przetestowania - skrypt zwykle nie działa w powłoce interaktywnej (ale może tak być, jeśli jest pozyskiwany) . Testowanie nai
in$-
jest poprawnym sposobem sprawdzenia, czy powłoka jest interaktywna. Testowanie-t 0
lub-t 2
poprawny sposób sprawdzenia, czy skrypt działa w terminalu, który różni się od interaktywności.Użyj zmiennej bash $ SHLVL, aby wykryć poziom zagnieżdżenia powłoki. W skrypcie uruchamianym „surowym” przez dwukrotne kliknięcie będzie to 1, w skrypcie działającym w terminalu będzie to 2.
źródło
Chociaż odpowiedź goldilocks jest prawdopodobnie poprawna w typowym przypadku, wydaje się, że istnieją przypadki skrajne. W moim przypadku mój Xserver jest skonfigurowany do uruchamiania
tty1
i nigdy nie pozostawia tego tty. Jeśli Xorg'sstdout
jest TTY, wydaje się, że klienci będą domyślnie mieli ten TTY połączony z deskryptorem pliku.Oto jak rozwiązałem mój problem:
Nie testowałem tego, aby sprawdzić, czy działa na bardziej standardowej konfiguracji X, a także bardzo wątpię, czy jest to jedyny przypadek na krawędzi. Jeśli ktoś znajdzie bardziej ogólne rozwiązanie, wróć i powiedz nam.
źródło
Innym, używając opcji bash określone zmiennej wewnętrznej
$-
.Z
.bashrc
,źródło
cmd | sh -i | cmd
.