Как запустить эмулятор терминала во время работы оболочки?

Я создаю альтернативный репортер системной информации, такой как neofetch, он работает нормально, но есть одна проблема. Он не может получить текущий эмулятор терминала во время работы bash. Я попробовал эти команды:

readlink "/proc/$(cat /proc/$(echo $$)/stat|cut -d ' ' -f 4)/exe"
ps -o comm= -p $(ps -o ppid= -p $$)

Они прекрасно работают при обычном выполнении, но когда я помещаю их в сценарий bash, он просто возвращает bash или /usr/bin/bash.

Я хочу найти команду, которая всегда сообщает об эмуляторе терминала, а не оболочке. Вот полный код, если хотите:

#!/bin/sh

# yes. no logos. because why not?

# source the config file
if [ "$colorsoff" = "" ]; then
    colorsoff=0
fi

[ -e /etc/betterfetchrc ] && . /etc/betterfetchrc 2> /dev/null
[ -e ~/.betterfetchrc ] && . ~/.betterfetchrc 2> /dev/null

CURRENT_VERSION_FILE = "/etc/betterfetch-version"  # Path to the file containing the current version
REMOTE_VERSION_URL = "https://raw.githubusercontent.com/sctech-tr/betterfetch/main/betterfetch-version"

# Fetch the remote version from the URL
REMOTE_VERSION=$(curl -s $REMOTE_VERSION_URL)

# Read the current version from the version file
if [ -f "$CURRENT_VERSION_FILE" ]; then
  CURRENT_VERSION=$(cat "$CURRENT_VERSION_FILE")
else
  echo "error: current version file not found."
  exit 1
fi

# Compare the remote version with the current version
if [ "$REMOTE_VERSION" != "$CURRENT_VERSION" ]; then
  echo "betterfetch ($REMOTE_VERSION) is available! you are currently on version $CURRENT_VERSION."
  exit 0
fi



# the meat and potatoes, actual fetch

# only set these if they are not already set by the config file
[ -z "$os" ] && . /etc/os-release 2>/dev/null || export os = "Unknown"
[ -z "$host" ] && host=$(cat /proc/sys/kernel/hostname)
[ -z "$kernel" ] && kernel=$(sed "s/version // ; s/ (.*//" /proc/version)
[ -z "$uptime" ] && uptime=$(uptime -p 2>/dev/null | sed "s/up //")
[ -z "$shell" ] && shell=$(printf "$SHELL" | sed "s//bin///" | sed "s//usr//")
[ -z "$de" ] && de=$(echo $XDG_CURRENT_DESKTOP)
[ -z "$terminal" ] && terminal=$(readlink "/proc/$(cat /proc/$(echo $$)/stat|cut -d ' ' -f 4)/exe")

printf "$USER@$host\n"
printf "OS           $os\n"
printf "Kernel       $kernel\n"
printf "Uptime       $uptime\n"
printf "Shell        $shell\n"
printf "DE           $de\n"
printf "Terminal     $terminal\n"
if [ "$colorsoff" != 1 ]; then
    printf "\033[0;31m● \033[0;32m● \033[0;33m● \033[0;34m● \033[0;35m● \033[0;36m● \033[0;37m●\033[0m\n"
fi

🤔 А знаете ли вы, что...
Bash поддерживает механизмы подстановки и раскрытия переменных для удобной работы с текстом.


56
1

Ответ:

Решено

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

Следующее выглядит нормально. Добавьте в список дополнительные терминалы, которые вы хотите обработать.

terminals = "konsole xterm etc.."  # space separated list of terminal emulators
terminal=unknown
cur=$$
while cur=$(ps -o ppid:1= -p "$cur") && ((cur)); do
  comm=$(<"/proc/$cur/comm")
  if [[ " $terminals " = *" $comm "* ]]; then
    terminal=$comm
    break
  fi
done
echo "$terminal"