Открывая терминал кроме xterm, выполняя команду на нем и не закрывая терминал после того, как это успешно закончилось

SHELL указан POSIX. Заключение в кавычки:

SHELL Эта переменная должен представить путь предпочтительного интерпретатора командного языка пользователя. [...]

Выполнение другой оболочки не обязательно указывает на изменение в предпочтении пользователя.

Хорошо изучить типы вещей, которые указывает POSIX и где искать их, так как большинство *.nix систем стремится к соответствию POSIX. Переменные среды являются одной из тех вещей.

5
23.03.2018, 13:02
2 ответа

Существенная проблема заключается в том, что терминалы на основе VTE не обрабатывают командную строку таким же способом , что и xterm. Это помимо возможных проблем с опцией удержания (ненужной в этом обсуждении).

Кавычки в этой команде

xterm -e "sudo pacman -Syu;bash"

являются проблемой. Эта строка в кавычках представляет собой одиночный токен, переданный в xterm как единственный параметр.

В xterm сначала пробуются токены после -e в качестве параметров для вызова execv. В противном случае он пытается выполнить что-то вроде "$ {SHELL: -sh}" -c "parameters" (запускает предпочитаемую вами оболочку для интерпретации параметров как командной строки).konsole делает то или другое (вероятно, первое, поскольку это было исходным поведением xterm, и большая часть дизайна konsole датируется концом 1990-х). Когда xterm был изменен для luit, альтернатива "отказ от этого" помогла с передачей параметров в luit.

Терминалы на базе VTE какое-то время пытались выполнить один аспект в одной опции командной строки, а другой - в другой (насколько я помню, -e и -x , но поменять местами роли двух опций и является предметом интересного отчета об ошибке Debian, которого я не вижу в данный момент). В текущей версии попытка

gnome-terminal -e "sudo pacman -Syu;bash"

не удалась, потому что она работает только с исходным поведением, подобным xterm. И (учитывая, что другие терминалы используют несколько более старые версии VTE), поскольку разработчики gnome-terminal (которые частично совпадают с разработчиками VTE ...) некоторое время назад отказались от опции -x , эта опция недоступен для команды. Этот работает, потому что он следует исходной модели xterm:

gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""

Параметр -e частично адресуется в Debian с помощью сценария оболочки, который пытается предоставить минимальный набор параметров (включая один для названия). Политика Debian для этого была основана на xterm в конце 1990-х годов и неоднократно обсуждалась.

Дополнительная литература:

2
27.01.2020, 20:35

В разных эмуляторах есть различные возможности и протоколы для функции удержания в открытом состоянии. Некоторые просто не могут / не могут этого сделать. Другие требуют, чтобы сценарий указывал, что эмулятор остается открытым. Я столкнулся с этим при написании простого скрипта для программы под названием HDSentinel. Вот различные решения, которые я могу использовать:

KDE (эмулятор Konsole)

konsole -hold -e sudo ./HDSentinel

( -hold - необходимый параметр)

Enlightenment (эмулятор терминологии)

terminology --hold -e "sudo ./HDSentinel"

( --hold - необходимый параметр)

XFCE (эмулятор XFCE4)

xfce4-terminal -H -x "sudo ./HDSentinel"

( -H - необходимый параметр;)

РЕДАКТИРОВАТЬ: -x используется вместо -e в терминале xfce

Mate (эмулятор mate-terminal)

mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"

(с этим эмулятором вы должны сначала создать собственный профиль, чтобы держать эмулятор открытым, я назвал свой HoldOpen, но подойдет любое имя)

Gnome (gnome -терминальный эмулятор)

gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"

(работает так же, как Mate, создать профиль для удержания эмулятора открытым)

LXDE (lxterminal)

Эмулятор lxterminal , поставляемый с LXDE, не поддерживает удержание терминала open

Итак, суть в том, что некоторые эмуляторы будут поддерживать удержание в открытом состоянии, а некоторые нет. То, как вы включите эту функцию, будет отличаться от тех, которые это делают. Если вы смотрите на эмулятор, не указанный здесь, вам придется погуглить эмулятор, чтобы узнать, разрешено ли / как вы включаете удержание в открытом состоянии.

Если эмулятор, который у вас есть, вообще не поддерживает удержание в открытом состоянии, вы можете обнаружить, что в вашем дистрибутиве есть альтернативный эмулятор, который его поддерживает (многие дистрибутивы включают xterm, а также эмулятор их настольной версии). Если у вас нет эмулятора, поддерживающего удержание, вы всегда можете получить его из репозитория программного обеспечения.

Эта информация представляет собой довольно много времени на исследования,Поэтому я надеюсь, что это поможет людям сэкономить некоторое время и разочарование. Кстати, Xterm также использует параметр , поэтому я считаю, что ; Bash будет служить для проведения эмулятора, который предлагает параметр для открытой функции HOLD. Но что он не будет создавать открытую функцию HOLD, если эмулятор не поддерживает это (как в случае lxterminal) или включает открытие, если этот эмулятор использует пользовательский профиль для включения открытия (как в случае GNOME).

7
27.01.2020, 20:35

Теги

Похожие вопросы