Ложный Позитив
Как подсказывает большинство результатов в Google, вы можете использовать tty
, что обычно возвращает "не tty" , когда он не запущенв терминале.Однако, похоже, это отличается от сценариев, вызываемых через bindsym exec
в i3 / Sway:
/dev/tty1 # From a keybind
/dev/pts/6 # In a terminal
/dev/tty2 # In a console
Хотя tty | grep pts
будет частично отвечать на вопрос, он не может различить запуск в консолиvs от привязки клавиш, которая вам не нужна, если вы пытаетесь показать графический интерфейскак родительский процесс.Имея это в виду, что-то подобное может работать:
{
[ "$PPID" = "1" ] && echo "keybind" || echo "terminal"
} > /tmp/detect.log
Вероятно, безопасное предположение, что процесс systemd
всегда будет иметь 1
в качестве PID, но естьнет никакой гарантии, что в каждой системе, использующей i3, также будет использоваться systemd, поэтому, вероятно, этого лучше избегать.
Лучшее решение
Более надежный способ - использовать ps
.Согласно PROCESS STATE CODES
на странице man:
Для форматов BSD и при использовании ключевого слова stat могут отображаться дополнительные символы:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
Ключздесь +
на последней строке.Чтобы проверить это в терминале, вы можете позвонить по номеру ps -Sp <PID>
, который будет иметь значение STAT
, равное Ss
при работе в интерактивном режиме, или S+
, если он запускается с помощью связывания клавиш.В столбце STATE
вы можете дополнительно очистить его с помощью -o stat=
, который также удалит заголовки, а затем направить через grep, чтобы получить следующее:
is_interactive() {
ps -o stat= -p $$ | grep -q '+'
}
if is_interactive; then
read -rp "Enter your username: " username
else
username=$(yad --entry --text "Enter your username:")
fi
Это будет работать не только в терминалеэмулятор и через связывание клавиш i3 / Sway, но даже в необработанном окне консоли, что делает его гораздо более надежным вариантом, чем tty
выше.