Вот пример:
#!/bin/bash
GRAND_PARENT_PID=$(ps -ef | awk '{ print $2 " " $3 " " $8 }' | \
grep -P "^$PPID " | awk '{ print $2 }')
GRAND_PARENT_NAME=$(ps -ef | awk '{ print $2 " " $3 " " $8 }' \
| grep -P "^$GRAND_PARENT_PID " | awk '{ print $3 }')
case "$GRAND_PARENT_NAME" in
gnome-terminal)
echo "I was invoked by gnome-terminal"
;;
xterm)
echo "I was invoked by xterm"
;;
*)
echo "I was invoked by someone else"
esac
Теперь позвольте мне объяснить это немного подробнее.В случае, когда скрипт выполняется (в) терминалом, его родительский процесс всегда является самой оболочкой.Это связано с тем, что эмуляторы терминала запускают shell для вызова скриптов.Так что идея состоит в том, чтобы взглянуть на процесс дедушки и бабушки.Если процесс-дедушка является терминалом, то вы можете предположить, что ваш скрипт был вызван из терминала.В противном случае он был вызван чем-то другим, например, Nautilus, который является файловым браузером Ubuntu по умолчанию.
Следующая команда дает вам идентификатор родительского процесса.
ps -ef | awk '{ print $2 " " $3 " " $8 }' | grep -P "^$PPID " | awk '{ print $2 }'
И эта командадавая вам имя родительского процесса вашего родителя.
ps -ef | awk '{ print $2 " " $3 " " $8 }' | grep -P "^$GRAND_PARENT_PID " | awk '{ print $3 }'
И последний оператор switch просто сравнивает имя процесса прародителя с некоторыми известными эмуляторами терминала.