Как скрипт 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 
  • Perl-скрипт, делать cd на терминале
  • Печать на X-терминал быстрее, чем печать на tty?
  • перенаправление не выполняется
  • Как программы выводятся в другое место, кроме STDOUT / STDERR? Как этого избежать?
  • "W | хвост "отбивает текст с правым краем (78 символов)
  • Поиск ключевого слова в файле PDF
  • Могу ли я увеличить яркость текста в оболочке Arch?
  • Как читать с другого терминала?
  • Заголовок вкладки терминала не работает корректно с помощью MacPorts bash
  • Как установить tar-файл (jhead) на компьютере Mac или Linux
  • Греп против внимания на mac
  • Копирование текста с одного терминала на другой
  • Linux и Unix - лучшая ОС в мире.