В недавнем выпуске 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 или что-то еще.