Как скрипт Bash может сказать, как он был запущен?

У меня есть сценарий Bash, который я пытался сделать, чтобы помочь мне запустить довольно сложную команду с небольшими изменениями, которые она спросит меня об эхом и чтении.

Я нашел решения, чтобы заставить его запускать терминал для выполнения команды, но меня это не интересует. Я бы хотел, чтобы это было, если я просто выскользнул и просто нажал Enter на нем в Nautilus (чтобы запустить его с помощью Run Software), он просто осторожно выведет сообщение с сообщением «Пожалуйста, запустите это с терминала».

Я могу получить всплывающее окно – как в команде знаю, но я не могу заставить скрипт Bash сказать, запущен ли он в терминале или нет, похоже, всегда так думает. Возможно ли это?

2 Solutions collect form web for “Как скрипт Bash может сказать, как он был запущен?”

От man bash при УСЛОВНЫХ ЭКСПРЕССИЯХ :

 -t fd True if file descriptor fd is open and refers to a terminal. 

Предполагая, что fd 1 является стандартным, if [ -t 1 ]; then if [ -t 1 ]; then следует работать. В Руководстве по разработке сценариев Advanced Shell утверждается, что -t используемый таким образом, завершится с ошибкой по ssh и что тест (с использованием stdin, а не stdout) должен быть таким:

 if [[ -t 0 || -p /dev/stdin ]] 

-p если файл существует и является именованным каналом. Тем не менее , я бы сказал, что это неправда для меня: -p /dev/stdin не работает как для обычных терминалов, так и для ssh-сессий, тогда как if [ -t 0 ] (или -t 1 ) работает в обоих случаях (см. Также комментарии Gilles ниже о проблемах в этом разделе руководства Advanced Scripting Guide ).


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

 !#/bin/bash export SPECIAL_CONTEXT=1 /path/to/real/script.sh 

Вызовите этот live_script.sh или что угодно, и вместо этого дважды щелкните его. Конечно, вы могли бы сделать то же самое с аргументами командной строки, но оболочка все равно понадобилась бы для создания точки и щелчка в графическом браузере.

Другой, используя параметры bash, задает внутреннюю переменную, $- .

Из .bashrc ,

 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac 
  • Терминал изменяет размеры
  • Как автозапуск devilspie под gnome3 на Fedora 21?
  • exec -t недействителен
  • Что происходит при нажатии Ctrl + Alt + F <Num>?
  • Странное поведение значения терминала PS1 в Mac против Ubuntu
  • CentOS 7 Почему пакет звуковых сигналов не существует?
  • Определите, сколько из Unicode поддерживает мой терминал, даже через экран
  • Ctrl + c не будет убивать процесс
  • Backspace, вкладка не работает в терминале (с использованием ssh)
  • terminfo отключить XON / XOFF
  • Alt-Left для пропуска слов не работает в эмуляторах терминалов
  • Interesting Posts

    заменить текст после матча

    Как установить клиент OpenVPN на RHEL 7.3?

    Как получить IP-адреса возможных злоумышленников ssh?

    Как включить вкладку «Обработка страницы» в диалоговом окне печати в Arch Linux

    Каковы последствия отсутствия действительной таблицы разделов?

    Результат от ядра вернулся к какому процессу?

    Выделение метасимволов в основных / расширенных строках регулярных выражений posix в grep

    Загрузка изображения ядра

    Доступ к контейнеру TrueCrypt без TrueCrypt. Какие опасности ждут?

    Анализируя сложные штучки и имея удобный список полезных

    Лучший способ приблизиться к ошибкам ядра HID_MAX_USAGES?

    Проблема с установкой Chromium на libgl1-mesa-glx: i386

    Как предотвратить gnome для монтирования моего USB-устройства, когда я использую KDE?

    Как узнать, почему cron не выполняет мои задания?

    Любой способ зарегистрировать исходное программное обеспечение с базой данных rpm / yum?

    Linux и Unix - лучшая ОС в мире.