Inną możliwością jest commandobniżenie wersji execze 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 commandto 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 Xtty - konsoli. Po uruchomieniu Xaplikacji z X .desktoppliku generowane przez nią dane wyjściowe są kierowane do Xwirtualnego terminala - czyli tego, co to było, z którego uruchomiłeś Xaplikację. 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 Xorg1.16, która pozwala mu działać w systemdsesji 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 appwyjścia konsoli są kierowane /dev/tty$((1+$XDG_VTNR))raczej do mojego xtermpty. 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/consolejest na ogół już zarezerwowany do tego, choć możesz nie chcieć robić tego, chownco 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ć xtermotwarte okno, zapisać dane wyjściowe ttypo uruchomieniu z niego w zmiennej środowiskowej i użyć tej wartości jako miejsca docelowego dla guidanych 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 bashhistorią, jeśli jesteś zainteresowany.