2013-11-09 3 views
1

Я написал простой скриптКак выйти из терминала после завершения сценария?

#!/bin/bash 
nohup $1 & 
exit 

, что он должен делать, если я исполню 'scriptName' gedit, он должен открыть Gedit, а затем закрыть терминал. Но проблема заключается в том, что терминал не закрыт после выполнения скрипта.

Вещь, сделанная уход:

  • проверяемые терминальные предпочтения к When command exits: Exit the terminal
  • Я хочу, чтобы поместить этот скрипт в /usr/local/bin так, я не могу использовать исполнение как. ./scriptname
  • Похоже, что терминал не является родителем этого. Как мне это изменить?

ответ

2

подход вы пытаетесь не будет работать по следующей причине:

Оболочка для терминальной сессии является один процесс; обычно, когда вы выполняете сценарий оболочки, оболочка сеанса терминала запускает второй процесс оболочки и запускает сценарий под этим. Итак, ваш exit в конце скрипта говорит, что вторая оболочка завершается - что бы она сделала, так как она дошла до конца скрипта. Хотя вы можете попробовать убить первый процесс оболочки из второго процесса оболочки (см. Комментарий о $PPID в другом ответе), это будет не очень хорошая форма.

Для вашего сценария работать так, как вы ожидаете, чтобы работать, вы должны будете получить терминальный сеанс оболочку для выполнения команд в вашем сценарии с помощью встроенной команды source Баша - введи source /path/to/your/script gedit или . /path/to/your/script gedit для краткости.

Из-за того, что вам нужно было выполнить это, установка сценария на ваш PATH не помогла бы - но вы могли бы создать псевдоним («ярлык», который расширяется до серии команд оболочки), чтобы сделать работу сценарий проще - добавьте строку, например alias your_alias_name='. /path/to/your/script', на ваш ~/.bashrc.

+0

«exec nohup gedit», когда я пытался, не закрывает терминал. Я не могу получить PID терминала, в котором выполняется сценарий, а затем убить его? – nitishch

+0

Да, моя ошибка.Псевдоним не поможет вам запустить 'exec nohup gedit &', или, если на то пошло, 'exec nohup gedit -d'. Я существенно пересмотрел свой ответ - повторите попытку. – pobrelkey

+0

Да, спасибо, это сработало. Итак, 'source' говорит использовать ту же оболочку для запуска скрипта, не создавая подкоманду? – nitishch

0

Я предполагаю, что вы находитесь на Mac - потому что вы упоминаете Настройки. Вопрос в том, как вы начали сценарий?

Если вы запустили терминал и затем выполнили «имя_источника» из терминала, терминал не будет уходить, поскольку он все еще запускает вашу оболочку. Внимательно проверьте настройки, в нем говорится: «Когда оболочка выходит», а не «Когда команда выходит».

+0

Я использую Ubuntu, и он говорит, что «когда команда выходит» - это настройки профиля. – nitishch

+1

Вы можете убить родительский процесс вашего сценария после выхода «nohup» с «kill $ PPID» –

+0

Я пробовал, он не работал – nitishch

0

Ниже приведен пример сценария.

#!/bin/bash 
echo "hi" 
/bin/bash/abc.sh & 
sleep 2 
#sleep is used to pause the execution temporary to see the output. 
kill -25 $PPID 

Значение, которое передает команду kill, определяет поведение. Here вы можете найти разные значения.

Убить -25 работал для меня, чтобы закрыть терминал и не забудьте добавить "&" в конце команды. :)

Смежные вопросы