Wolę uruchamiać aplikacje GUI z okna terminala niż przy użyciu pulpitu graficznego. Częstą irytacją jest to, że często programiści nie przewidywali tego rodzaju użycia, więc aplikacja drukuje wiele niepotrzebnych, tajemniczych lub nieinformacyjnych wiadomości na stdout lub stderr. Występuje dalszy bałagan na terminalu, ponieważ uruchomienie programu w tle, z &, generuje raporty o utworzeniu i zakończeniu zadania.
Jakie jest obejście tych problemów, które będą akceptować argumenty wiersza poleceń i obsługiwać automatyczne uzupełnianie?
Powiązane: /programming/7131670/make-bash-alias-that-takes-parameter
źródło
$DISPLAY
nie jest ustawiony (np. Jeśli użytkownik zapomniał-X
o ssh) lub problem z autoryzacją X, taki jak tutaj: unix.stackexchange.com/questions/108679/..."$@" 2>&1 | { quit=$(($(date +%s)+5)); while read line && [ $(date +%s) -lt $quit ]; do printf "[%s] %s\n" "$(date +%T)" "$line"; done; } | head -n 10 &
(najważniejszym punktem był pomysł, a nie faktyczna implementacja).Ta odpowiedź jest na bash. Jako przykład, oto co robię w moim .bashrc, aby wykonać polecenie wygody,
ev
aby uruchomić przeglądarkę plików PDF Evince.Pierwszy wiersz definiuje funkcję
ev
. Nazwa funkcji zostanie rozpoznana, gdy użyjesz jej w wierszu poleceń w następujący sposób:(Jest to inny mechanizm niż aliasy i ma niższy priorytet.) Dane wyjściowe Evince'a do stdin i stdout są wysyłane do bitbucket (/ dev / null). Znak ampersand umieszcza zadanie w tle. Otaczanie polecenia w nawiasach powoduje, że jest ono uruchamiane w podpowłoce, aby nie drukowało komunikatów o utworzeniu zadania w tle lub jego zakończeniu.
Druga linia z mojego .bashrc używa pełnej funkcji bash, aby powiedzieć bashowi, że argumentem polecenia ev powinien być plik z rozszerzeniem pdf. Oznacza to, że jeśli mam również pliki foo.tex, foo.aux itp., Które siedzą w moim katalogu, mogę pisać
ev foo
i naciskać klawisz Tab, a bash będzie wiedział, że należy uzupełnić nazwę pliku jako foo.pdf.źródło
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Inną możliwością jest
command
obniżenie wersjiexec
ze specjalnego wbudowanego do zwykłego starego wbudowanego, takiego jak:Teraz możesz zrobić:
Właśnie zauważyłem, że
command
to nie działazsh
(jak to wygląda w większości innych powłok) , ale tam, gdzie to nie działa, możesz zamiast tego:... które powinny działać wszędzie.
W rzeczywistości możesz nawet:
Więc możesz zrobić:
WYNIK
Po dyskusji na komentarzu z @ vinc17, warto zauważyć, że prawie wszystkie dane wyjściowe konsoli GUI są generalnie przeznaczone dla
X
tty - konsoli. Po uruchomieniuX
aplikacji zX
.desktop
pliku generowane przez nią dane wyjściowe są kierowane doX
wirtualnego terminala - czyli tego, co to było, z którego uruchomiłeśX
aplikację. Mogę zaadresować ten numer tty za pomocą$XDG_VTNR
.O dziwo - i może dlatego, że właśnie zacząłem używać
startx
- nie mogę już pisać/dev/tty$XDG_VTNR
. Może to również (jak sądzę jest bardziej prawdopodobne) mieć coś wspólnego z ostatnią i drastyczną zmianą zaimplementowaną w wersjiXorg
1.16, która pozwala mu działać wsystemd
sesji użytkownika, zamiast wymagać uprawnień roota .Nadal mogę:
Teraz wszystkie
some x app
wyjścia konsoli są kierowane/dev/tty$((1+$XDG_VTNR))
raczej do mojegoxterm
pty. W każdej chwili mogę uzyskać ostatnią stronę tego:Prawdopodobnie najlepszą praktyką jest dedykowanie terminalu wirtualnego do rejestrowania danych wyjściowych.
/dev/console
jest na ogół już zarezerwowany do tego, choć możesz nie chcieć robić tego,chown
co jest prawdopodobnie wymagane, abyś beztrosko pisał na ten temat. Możesz mieć jakąś funkcję, która pozwala ci zrobićprintk
- co w zasadzie drukuje/dev/console
- i dlatego możesz użyć tego w ten sposób.Innym sposobem na zrobienie tego byłoby poświęcenie pieniędzy na takie cele. Możesz na przykład pozostawić
xterm
otwarte okno, zapisać dane wyjściowetty
po uruchomieniu z niego w zmiennej środowiskowej i użyć tej wartości jako miejsca docelowego dlagui
danych wyjściowych. W ten sposób wszystkie dzienniki zostaną przekierowane do osobnego okna dziennika, które możesz następnie przewinąć, jeśli chcesz.Kiedyś napisałem odpowiedź o tym, jak podobną rzecz można zrobić z
bash
historią, jeśli jesteś zainteresowany.źródło
echo $?
ponieważ dodaje ona niepotrzebne informacje i jest oparty na błędzie w bash, który właśnie zgłosiłem tutaj: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html oraz w BTS Debiana: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969