Я предпочитаю запускать приложения с графическим интерфейсом из окна терминала, а не с помощью графического рабочего стола. Часто раздражает то, что разработчики часто не ожидали такого использования, поэтому приложение выводит на stdout или stderr множество бесполезных, загадочных или неинформативных сообщений. Дальнейшая помеха в терминале происходит из-за запуска программы в фоновом режиме, с &, генерирует отчеты о создании и завершении работы.
Какой обходной путь для этих проблем будет принимать аргументы командной строки и обрабатывать автозаполнение?
Связанный: /programming/7131670/make-bash-alias-that-takes-parameter
источник
$DISPLAY
не задано (например, если пользователь забыл a-X
для ssh) или о проблеме авторизации X, как здесь: 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 &
(самым важным моментом была идея, а не фактическая реализация).Этот ответ для Баш. В качестве примера, вот что я делаю в своем .bashrc, чтобы сделать удобную команду
ev
для запуска программы просмотра PDF Evince.Первая строка определяет функцию
ev
. Имя функции будет распознано, когда вы будете использовать ее в командной строке следующим образом:(Этот механизм отличается от псевдонимов и имеет более низкий приоритет.) Вывод Evince в stdin и stdout отправляется в битовую корзину (/ dev / null). Амперсанд ставит работу на задний план. Окружение команды в круглых скобках приводит к тому, что она запускается в подоболочке, чтобы не печатать сообщения о создании фонового задания или его завершении.
Во второй строке моего .bashrc используется полная функция bash, чтобы сообщить bash, что аргумент команды ev, как ожидается, будет файлом с расширением pdf. Это означает, что, если у меня также есть файлы foo.tex, foo.aux и т. Д., Которые находятся в моем каталоге, я могу напечатать
ev foo
и нажать клавишу Tab, и bash узнает, что имя файла должно заканчиваться как foo.pdf.источник
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Другая возможность - использовать
command
для переходаexec
от специальной встроенной функции к простой старой встроенной, например:Итак, теперь вы можете сделать:
Я только что заметил, что
command
это не работаетzsh
(как, кажется, работает в большинстве других оболочек) , но где это не работает, вы можете сделать вместо этого:... который должен работать везде.
На самом деле, вы могли бы даже сделать:
Так что вы могли бы сделать:
ВЫХОД
После обсуждения комментариев с @ vinc17 стоит отметить, что почти все выходные данные консоли GUI-приложения обычно предназначены для
X
tty - его консоли. Когда вы запускаетеX
приложение изX
.desktop
файла, вывод, который он генерирует, направляется наX
виртуальный терминал - то есть тот, с которого он был запущенX
. Я могу обратиться к этому номеру tty с$XDG_VTNR
.Странно, хотя - и, возможно, потому что я только начал использовать
startx
- я больше не могу просто писать в/dev/tty$XDG_VTNR
. Это также может (как мне кажется, более вероятно) иметь какое-то отношение к самым последним и радикальным изменениям, реализованным вXorg
v1.16, которые позволяют запускать его в рамкахsystemd
пользовательского сеанса, а не требовать привилегий root .Тем не менее, я могу сделать:
Теперь весь
some x app
консольный вывод перенаправляется на/dev/tty$((1+$XDG_VTNR))
мойxterm
pty. Я могу получить последнюю страницу этого в любое время, как:Вероятно, в любом случае лучше всего выделить какой-нибудь виртуальный терминал для вывода журнала.
/dev/console
как правило, уже зарезервировано для этого, хотя вы можете предпочесть не делать то,chown
что, вероятно, требуется для вас, чтобы беспечно написать на это. У вас может быть какая-то функция, которая позволяет вам выполнятьprintk
- которая в основном печатает,/dev/console
- и поэтому я могу использовать ее таким образом, как я полагаю.Другой способ сделать это - посвятить pty таким целям. Вы можете, например, оставить
xterm
окно открытым, сохранить выходные данныеtty
при запуске оттуда в переменной среды и использовать это значение в качестве места назначения дляgui
выходных данных. Таким образом, все журналы будут перенаправлены в отдельное окно журнала, которое вы можете затем прокрутить, если хотите.Однажды я написал ответ о том, как подобное можно сделать с
bash
историей, если вам интересно.источник
echo $?
поскольку оно добавляет бесполезную информацию, и оно основано на ошибке в bash, о которой я только что сообщил здесь: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html и в Debian BTS: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969