Открытие терминала для текущего скрипта bash, если он не был запущен в одном

440
Kev

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

Основываясь на этом вопросе, я попытался в файле с именем testtermотмеченный исполняемый файл:

#! /bin/sh if [ -t 0 ]; # stdin then echo "yay! terminal!" else Terminal sh ~/Desktop/testterm fi 

... но Хайку Terminalпросто открывается и никогда ничего не показывает, или иногда открывается и уходит немедленно.

Из Терминала, если я наберу, Terminal sh ~/Desktop/testtermон работает один раз, открывая Терминал с помощью «yay! Терминал! в нем, но затем последующие попытки приводят к пустым терминалам.

2
Не называйте ваш файл `test`, поскольку вы, вероятно, вызываете системный` / usr / bin / test`. slhck 11 лет назад 1
Спасибо, я не думал об этом. Отредактировал вопрос. (Это все еще не работает, но по крайней мере я знаю, что это не из-за конфликта именования на этот раз.) Kev 11 лет назад 0
Тест работает? Замените `Terminal` другой командой, он работает правильно? terdon 11 лет назад 1
Я не очень много знаю о Haiku, но вот что я попробую: 1. Убрать пробел между shebang и `/ bin / sh`. 2. Используйте относительный или абсолютный путь для testterm. 3. Попробуйте выполнить `Terminal testterm &` из терминала. Все эмуляторы терминалов, с которыми я работал, требуют переключения перед исполняемым файлом (например, `xterm -e. / Testterm`). Dennis 11 лет назад 1
@terdon, да `StyledEdit` открывается нормально, а не` Terminal`. @Dennis, 1. похоже, ничего не меняет (плюс, все мои другие скрипты запускаются именно так) 2. попробовал это, тоже без разницы 3. он делает то же самое, что и скрипт, открывая Терминал, который никогда ничего не показывает. `Terminal --help` не упоминает опцию для исполняемого файла, но если вы передаете аргумент, он, похоже, ищет файл ... может, не выполнить его, хотя? Kev 11 лет назад 0
Предполагая, что `Terminal` работает как` xterm`, файл, который он ищет, является оболочкой, которую он должен запустить. Если так, я могу придумать обходной путь. Попробуйте запустить `Terminal sh`, он использует` sh` вместо `bash`? terdon 11 лет назад 1
@terdon, да, подтверждено с помощью `echo $ 0`. Поэтому я попробовал `Terminal sh ~ / Desktop / testterm`. Как ни странно, это работает, если я пытаюсь сделать это из окна `Terminal`, но не если я дважды щелкаю по значку testterm (тот же результат, что и у всех остальных). Kev 11 лет назад 0

1 ответ на вопрос

1
terdon

Взлом, который вы можете попробовать, заключается в следующем:

  1. Создайте специальный bashфайл .rc, который будет вашим исходным кодом bashrcи запускает ваш скрипт. Давай называть это~/foo.rc

    $ cat ~/foo.rc #!/bin/sh ~/Desktop/testterm 
  2. Создать новую «оболочку», которая требует bashс в ~/foo.rcкачестве файла .rc. Сохраните этот скрипт как fake_shellгде-то в вашем $PATH(например, ~/config/bin) и сделайте его исполняемым:

  3. Теперь в вашем testtermскрипте запустите, Terminalиспользуя fake_shellв качестве оболочки.

Сценарий становится:

#!/bin/sh if [ ! -t 0 ]; # stdin then TIMESTAMP=`date +%Y%m%d%H%M` echo "#!/bin/sh source /boot/common/etc/profile $0" > ~/temp_term$TIMESTAMP.rc echo "#!/bin/sh bash --rcfile ~/temp_term$TIMESTAMP.rc" > ~/config/bin/temp_shell$TIMESTAMP chmod a+x ~/config/bin/temp_shell$TIMESTAMP Terminal temp_shell$TIMESTAMP rm -f ~/config/bin/temp_shell$TIMESTAMP rm -f ~/temp_term$TIMESTAMP.rc fi  echo "yay! terminal!" # your script here exit 
@Kev, см. Мой обновленный ответ о взломе, который вы можете попробовать. terdon 11 лет назад 0
Потрясающие! 99% пути туда, и это все, что мне нужно. Пара вещей: в новом окне отображается приглашение `bash-4.0 #` вместо `/>` (не имеет значения), и когда вы закрываете окно, оно говорит: `Процесс" bash "все еще выполняется , Если вы закроете Терминал, процесс будет убит. (Терминалы обычно просто закрываются. Также не имеет большого значения.) Kev 11 лет назад 0
@Kev, приглашение можно изменить, установив переменную `PS1` в` foo.rc`, причина в том, что она отличается тем, что `/ etc / bash.bashrc` не читается, поэтому вы также можете исправить это, используя ее в `foo.rc`. Что касается ошибки, это потому, что вы явно запускаете `/ bin / bash`. Попробуйте запустить в фоновом режиме (`&`, хотя я сомневаюсь, что это будет работать). terdon 11 лет назад 0
`&` Заставляет Терминал снова казаться пустым, хотя это правильный синтаксис для асинхронных команд в Haiku. Спасибо за подсказку PS1, я посмотрю это. Кстати, не уверен, почему мой редактор вышел смешным ... Kev 11 лет назад 0

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