Inną możliwością jest command
obniżenie wersji exec
ze specjalnego wbudowanego do zwykłego starego wbudowanego, takiego jak:
alias shh='command exec >/dev/null 2>&1'
Teraz możesz zrobić:
(shh; call some process &)
Właśnie zauważyłem, że command
to nie działa zsh
(jak to wygląda w większości innych powłok) , ale tam, gdzie to nie działa, możesz zamiast tego:
alias shh='eval "exec >/dev/null 2>&1"'
... które powinny działać wszędzie.
W rzeczywistości możesz nawet:
alias shh='command exec >"${O:-/dev/null}" 2>&1'
Więc możesz zrobić:
O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile
WYNIK
can anyone hear
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 uruchomieniu X
aplikacji z X
.desktop
pliku generowane przez nią dane wyjściowe są kierowane do X
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 wersji Xorg
1.16, która pozwala mu działać w systemd
sesji użytkownika, zamiast wymagać uprawnień roota .
Nadal mogę:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
Teraz wszystkie some x app
wyjścia konsoli są kierowane /dev/tty$((1+$XDG_VTNR))
raczej do mojego xterm
pty. W każdej chwili mogę uzyskać ostatnią stronę tego:
fmt </dev/vcs$((1+$XDG_VTNR))
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ściowe tty
po uruchomieniu z niego w zmiennej środowiskowej i użyć tej wartości jako miejsca docelowego dla gui
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.