1

В недавнем выпуске vim появилась команда :terminal , которая запускает терминал в новой панели редактора.

Есть ли способ идентифицировать эти оболочки, запущенные из vim, по сравнению с обычными оболочками, запущенными xterm/urxvt/gnome-terminal?

2 ответа2

3

Начиная с патча Vim 8.1.049, Vim экспортирует переменную среды VIM_TERMINAL со значением v:version . До этого вы могли обойти это, только получив информацию о дереве процессов или, возможно, но не безошибочно, протестировав переменные среды $VIM и $VIMRUNTIME .

2

Общий подход с ps

Вам необходимо выяснить, является ли родительский процесс оболочки vim . Это работает в моем Debian 9:

pid=1234                              # specify PID of the shell in question
ps -o comm= "$(ps -o ppid= "$pid")"

где ps -o ppid= "$pid" возвращает идентификатор родительского процесса. Обратите внимание, что если нет процесса с PID $pid , вся команда станет ps -o comm= "" что недопустимо и выдаст ошибку.

Это предполагает, что вы знаете правильный PID. Например, вы можете перебрать вывод pidof bash:

for pid in $(pidof bash); do ps -o comm= "$(ps -o ppid= "$pid")" 2>/dev/null; done

Из самой оболочки

В самой оболочке право ПИД $$ поэтому выше упрощается

ps -o comm= "$(ps -o ppid= "$$")"   # non-optimal though, see below

Но есть и $PPID . Он устанавливается оболочкой на значение идентификатора родительского процесса во время инициализации оболочки. Поэтому это должно быть почти эквивалентно:

ps -o comm= "$PPID"

Почти, потому что в общем случае, если родительский процесс умирает, а оболочка выживает (это возможно), потерянная оболочка получит нового родителя. Это будет отражено ps -o ppid= "$$" но не echo "$PPID" , я думаю. В вашем случае расхождение не должно иметь значения, потому что:

  1. Если оболочка выживет, несмотря на два подхода, дающие разные результаты, ни один из результатов не будет vim , поэтому окончательный вывод будет "не терминалом vim" в любом случае.
  2. Я ожидаю, что vim убьет оболочку, начатую с :terminal когда он выйдет (хотя я не могу подтвердить это в данный момент), поэтому вышеприведенный пункт не имеет значения.
  3. Я ожидаю, что любая интерактивная оболочка выйдет сама по себе, когда потеряет свой управляющий терминал; таким образом, даже если предыдущее ожидание неверно или только vim принудительно убит (поэтому он не может отправлять сигналы своим дочерним элементам), оболочка все равно завершится. Таким образом, вышеуказанные пункты не имеют значения.

Поэтому я думаю, что можно предположить, что подходы с $PPID и без него на практике эквивалентны.


Обратите внимание, что в зависимости от ваших настроек и способа запуска vim , ps -o comm= ... может не возвращать буквальную строку vim . Например, это может быть vim.basic , vim.gtk3 или что-то еще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .