В недавнем выпуске vim появилась команда :terminal
, которая запускает терминал в новой панели редактора.
Есть ли способ идентифицировать эти оболочки, запущенные из vim, по сравнению с обычными оболочками, запущенными xterm/urxvt/gnome-terminal?
В недавнем выпуске vim появилась команда :terminal
, которая запускает терминал в новой панели редактора.
Есть ли способ идентифицировать эти оболочки, запущенные из vim, по сравнению с обычными оболочками, запущенными xterm/urxvt/gnome-terminal?
Начиная с патча Vim 8.1.049, Vim экспортирует переменную среды VIM_TERMINAL
со значением v:version
. До этого вы могли обойти это, только получив информацию о дереве процессов или, возможно, но не безошибочно, протестировав переменные среды $VIM
и $VIMRUNTIME
.
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"
, я думаю. В вашем случае расхождение не должно иметь значения, потому что:
vim
, поэтому окончательный вывод будет "не терминалом vim" в любом случае.vim
убьет оболочку, начатую с :terminal
когда он выйдет (хотя я не могу подтвердить это в данный момент), поэтому вышеприведенный пункт не имеет значения.vim
принудительно убит (поэтому он не может отправлять сигналы своим дочерним элементам), оболочка все равно завершится. Таким образом, вышеуказанные пункты не имеют значения.Поэтому я думаю, что можно предположить, что подходы с $PPID
и без него на практике эквивалентны.
Обратите внимание, что в зависимости от ваших настроек и способа запуска vim
, ps -o comm= ...
может не возвращать буквальную строку vim
. Например, это может быть vim.basic
, vim.gtk3
или что-то еще.