Как узнать, выбрал ли пользователь «Запустить в терминале» - PullRequest
4 голосов
/ 05 августа 2010

Когда вы дважды щелкаете скрипт bash, Ubuntu спрашивает, хочет ли пользователь отображать, запускать или запускать в терминале ...

Есть ли способ в сценарии определить, выбрал ли пользователь "Run In Terminal "?

Ответы [ 3 ]

6 голосов
/ 05 августа 2010

Строго говоря, вы не можете сказать, выбрал ли пользователь «Запустить в терминале» после нажатия на сценарий, или запустил терминал и запустил сценарий оттуда. Но приведенные ниже команды должны вам помочь, особенно [ -t 2 ].

if [ -t 1 ]; then
  echo "Standard output is a terminal."
  echo "This means a terminal is available, and the user did not redirect the script's output."
fi
if [ -t 2 ]; then
  echo "Standard error is a terminal." >&2
  echo "If you're going to display things for the user's attention, standard error is normally the way to go." >&2
fi
if tty >/dev/null; then
  echo "Standard input is a terminal." >$(tty)
  echo "The tty command returns the name of the terminal device." >$(tty)
fi
echo "This message is going to the terminal if there is one." >/dev/tty
echo "/dev/tty is a sort of alias for the active terminal." >/dev/tty
if [ $? -ne 0 ]; then
  : # Well, there wasn't one.
fi
if [ -n "$DISPLAY" ]; then
  xmessage "A GUI is available."
fi
1 голос
/ 05 августа 2010

Вот пример:

#!/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 просто сравнивает имя процесса прародителя с некоторыми известными эмуляторами терминала.

0 голосов
/ 05 августа 2010

Никогда не пробовал, но, вероятно, это работает:

if [ -t 1 ] ;

Хотя это также было бы ложным, если вывод по каналу ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...