У меня есть сценарий Bash, который я пытался сделать, чтобы помочь мне выполнить довольно сложную команду с небольшими изменениями, о которых она спрашивала бы меня через echo и read.
Я нашел решения, чтобы заставить его запустить терминал для выполнения команды, но меня это не интересует. Я хотел бы, чтобы, если я выделюсь и просто нажму Enter на нем в Nautilus (он запускается с помощью Run Software), он просто аккуратно выведет уведомление «Пожалуйста, запустите это из терминала».
Я могу заставить всплывающее окно появиться - как я знаю команду - но я не могу заставить скрипт Bash сказать, запущен ли он внутри терминала или нет, кажется, он всегда так думает. Это вообще возможно?
||
внутри,[ … ]
как это? Если вы используете[[ … ]]
то, это было бы хорошо, но обычно||
используется для разделения команд, и[ -t 0
это неправильный вызов,[
потому что его последний]
отсутствует. Там обычно нет команды-p
либо. Я согласен с тестированием терминала; это, вероятно, способ сделать это. Это просто синтаксис, который меня беспокоит.||
рассматривается перед необходимым последним]
аргументом для[
.PS1
не является надежным тестом, чтобы определить, является ли оболочка интерактивной. «Если сценарий должен проверять, выполняется ли он в интерактивной оболочке», это также сбивает с толку: должно быть, если некоторый код нуждается в проверке - сценарий обычно не выполняется в интерактивной оболочке (но это может быть, если он получен) , Тестированиеi
in$-
- это правильный способ проверить, является ли оболочка интерактивной. Тестирование-t 0
или-t 2
правильный способ определить, работает ли сценарий в терминале, который отличается от интерактивного.Используйте переменную bash $ SHLVL, чтобы определить уровень вложенности оболочки. В скрипте, запущенном «raw», при двойном щелчке он будет равен 1, в скрипте, запущенном в терминале, он будет равен 2.
источник
Хотя ответ Златовласка, вероятно, является правильным в типичном случае, кажется, что есть крайние случаи. В моем собственном случае мой xserver настроен на запуск с
tty1
и он никогда не покидает tty. Если Xorgstdout
- это TTY, то, по-видимому, клиенты будут иметь этот TTY, связанный с дескриптором файла по умолчанию.Вот как я решил свою проблему:
Я не проверял это, чтобы увидеть, работает ли он на более стандартной конфигурации X, и я также очень сомневаюсь, что это единственный крайний случай. Если кто-то найдет более приемлемое решение, пожалуйста, вернитесь и сообщите нам.
источник
Другой, используя опции Баш набор внутренних переменных,
$-
.От
.bashrc
,источник
cmd | sh -i | cmd
.