Как я могу определить, был ли сценарий вызван из командной строки или через двойной щелчок в файловом менеджере (Nautilis)?
Если первый, у меня все еще есть командная строка, когда сценарий заканчивается, но если по нему дважды щелкнули (или выполнился через .desktop файл), сценарий выполняется в окне и затем исчезает. Я хочу, чтобы окно осталось открытым с командной строкой.
Я полагаю, что сценарий мог осуществить эту проверку и или ничего не сделать - если вызвано из командной строки - или exec
удар в конце, если вызвано через двойной щелчок или .desktop.
Не были успешные методы использования, чтобы проверить если интерактивный или не или tty.
Можно проверить, является ли родительский процесс оболочкой. Например:
#! /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
Я проверил различия между средой при запущении скрипта от терминала и средой при запущении скрипта путем двойного щелчка по нему в Файлах;
, Когда Вы запускаете скрипт путем двойного щелчка в Файлах $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
завершение.
Можно проверить, был ли сценарий оболочки выполнен на терминале путем анализа вывода команды tty.
#! /bin/bash
if [[ $(tty) =~ "not a tty" ]]
then
echo "Not running on terminal"
else
echo "Running on terminal"
fi
При двойном щелчке от Наутилуса у Вас не будет всей установки среды как Вы, делают на регулярном терминальном сеансе. Я использую этот шаблонный код для предотвращения катастрофических отказов: введите описание ссылки здесь. Можно адаптировать его к потребностям:
# $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