Как проверить, был ли сценарий выполнен через командную строку или дважды щелкнулся?

Как я могу определить, был ли сценарий вызван из командной строки или через двойной щелчок в файловом менеджере (Nautilis)?

Если первый, у меня все еще есть командная строка, когда сценарий заканчивается, но если по нему дважды щелкнули (или выполнился через .desktop файл), сценарий выполняется в окне и затем исчезает. Я хочу, чтобы окно осталось открытым с командной строкой.

Я полагаю, что сценарий мог осуществить эту проверку и или ничего не сделать - если вызвано из командной строки - или exec удар в конце, если вызвано через двойной щелчок или .desktop.

Не были успешные методы использования, чтобы проверить если интерактивный или не или tty.

6
задан 9 February 2016 в 10:33

4 ответа

Можно проверить, является ли родительский процесс оболочкой. Например:

#! /bin/bash

if [[ $(readlink -f /proc/$(ps -o ppid:1= -p $)/exe) != $(readlink -f "$SHELL") ]]
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi

ps -o ppid:1= -p $ печать PID родительского процесса (ppid) из текущего процесса (-p $). readlink на /proc/<pid>/exe должен распечатать путь к исполняемому файлу, который был бы оболочкой, если бы Вы выполнили его в оболочке или чем-то еще иначе.

<час>

Другая возможность SHLVL переменная , который указывает, насколько вложенный ток экземпляр оболочки. Если выполнено в оболочке, сценарий должен иметь SHLVL 2 или больше. Когда выполнено путем двойного щелчка, или от настольного средства запуска, это должно быть 1:

#! /bin/bash

if (( SHLVL > 1 ))
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi
6
ответ дан 23 November 2019 в 07:43

Я проверил различия между средой при запущении скрипта от терминала и средой при запущении скрипта путем двойного щелчка по нему в Файлах;

, Когда Вы запускаете скрипт путем двойного щелчка в Файлах $VTE_VERSION, переменная сброшена, таким образом, можно сцепиться с нею, чтобы решить, заменить ли текущий экземпляр Bash интерактивным или нет.

таким образом, просто помещает это в конце Вашего сценария:

#! /bin/bash
# ...
[ ! -z $VTE_VERSION ] && exec bash

Для создания этой работы также в случае, если скрипт запущен от файла на рабочем столе измените Должностное лицо файла на рабочем столе =, строка от говорит:

Exec=/path/to/script

К:

Exec=sh -c '/path/to/script; exec bash'

Этот путь /path/to/script будет выполняться, и sh будет заменен Bash на /path/to/script завершение.

0
ответ дан 23 November 2019 в 07:43

Можно проверить, был ли сценарий оболочки выполнен на терминале путем анализа вывода команды tty.

#! /bin/bash

if [[ $(tty) =~ "not a tty" ]]
then
    echo "Not running on terminal"

else
    echo "Running on terminal"
fi
1
ответ дан 23 November 2019 в 07:43

При двойном щелчке от Наутилуса у Вас не будет всей установки среды как Вы, делают на регулярном терминальном сеансе. Я использую этот шаблонный код для предотвращения катастрофических отказов: введите описание ссылки здесь. Можно адаптировать его к потребностям:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi
0
ответ дан 23 November 2019 в 07:43

Другие вопросы по тегам:

Похожие вопросы: