Любой способ выхода из скрипта bash, но не выход из терминала



когда я использую exit команда в сценарии оболочки, сценарий завершит терминал (приглашение). Есть ли способ завершить скрипт, а затем остаться в терминале?



мой скрипт run.sh ожидается, что он будет выполняться непосредственно из источника или из другого сценария.



изменить:
Чтобы быть более конкретным, есть два скрипта run2.sh как



...
. run.sh
echo "place A"
...


и run.sh как



...
exit
...


когда я запускаю его с помощью . run2.sh, а если это нажмите exit codeline in run.sh, Я хочу, чтобы он остановился на терминале и остался там. Но с помощью exit весь терминал закрывается.



PS: Я пытался использовать return, а echo codeline будет по-прежнему выполняется....

639   10  

10 ответов:

"проблема" на самом деле заключается в том, что вы ищете и не выполняете сценарий. Когда вы создаете файл, его содержимое будет выполняться в текущей оболочке, а не порождать подоболочку. Так что все, включая выход, будет влиять на текущую оболочку.

вместо exit, вы хотите использовать return.

Да, вы можете использовать return вместо exit. Его основная цель-возврат из функции оболочки, но если вы используете ее в пределах source-D скрипт, он возвращается из этого скрипта.

как §4.1 "Bourne Shell Builtins" из Справочное Руководство Bash пишет:

     return [n]

вызовите функцию оболочки для выхода с возвращаемым значением n. Если n не поставляется, возвращаемое значение состояние выхода из системы последняя команда, выполняемая в функции. Это также может быть использовано для завершения выполнения выполняемого скрипта с помощью . (или source) встроенный, возвращая либо n или состояние выхода последней команды, выполненной в скрипте в качестве выхода состояние скрипта. Любая команда, связанная с RETURN ловушка выполнена перед выполнением возобновляется после выполнения функции или скрипта. Статус возврата не равен нулю, если return используется за пределами функция и не во время выполнения скрипта . или source.

вместо запуска кода с помощью . run2.sh вы можете запустить скрипт с помощью sh run2.sh или bash run2.sh
Новый экземпляр будет открыт для запуска скрипта, а затем он будет закрыт в конце скрипта, оставив другую оболочку открытой. -

Это так же, как вы положили функцию запуска внутри вашего скрипта run2.sh. Вы используете код выхода внутри run в то время как источник вашего run2.sh файл в Баш ТТИ. Если функция give the run имеет возможность выйти из вашего скрипта и дать run2.sh его сила, чтобы выйти из Терминатора. Затем, потому что функция запуска имеет возможность выйти из вашего теминатора.

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

в любом случае, я согласен с КАЗ это проблема дизайна.

Я думаю, что это происходит потому, что вы используете его в режиме источника с точкой

. myscript.sh

вы должны запустить это в подоболочке:

/full/path/to/script/myscript.sh

'source'http://ss64.com/bash/source.html

правильно, что исходные и выполненные скрипты используют return и exit чтобы сохранить тот же сеанс открытым, как отмечали другие.

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

следующий пример может быть запущен напрямую, как foo.sh или получены как . foo.sh/source foo.sh. В любом случае он будет держать сессию открытой после "выхода". Элемент $@ строка передается так, что функция имеет доступ к аргументам внешнего скрипта.

#!/bin/sh
foo(){
    read -p "Would you like to XYZ? (Y/N): " response;
    [ $response != 'y' ] && return 1;
    echo "XYZ complete (args $@).";
    return 0;
    echo "This line will never execute.";
}
foo "$@";

терминал результат:

$ foo.sh
$ Вы хотели бы XYZ? (Y/N): n
$ . foo.sh
$ Вы хотели бы XYZ? (Y/N): n
$ /
(окно терминала остается открытым и принимает дополнительный вход)

это может быть полезно для быстрого тестирования изменений скрипта в одном терминале, сохраняя при этом кучу кода лома под основным exit/return в то время как вы работаете. Это также может сделать код более переносимым в некотором смысле (если у вас есть тонны скриптов, которые могут или не могут быть вызваны по-разному), хотя это гораздо менее неуклюжим, чтобы просто использовать return и exit где это уместно.

Если ваш эмулятор терминала нет -hold вы можете очистить исходный скрипт и удерживать терминал с помощью:

#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read

в противном случае вы можете использовать $TERM -hold -e script

также не забудьте вернуться с ожидаемым возвращаемым значением. Иначе, если вы используете exit, когда вы столкнетесь с выходом, он выйдет из вашей базовой оболочки, так как источник не создает другой процесс (экземпляр).

чтобы написать сценарий, который является пуленепробиваемым для запуска как сценарий оболочки или был получен как rc-файл, скрипт может проверить и сравнить и $BASH_SOURCE и определить exit можно смело использовать.

вот короткий фрагмент кода для этого

[ "X$(basename )" = "X$(basename $BASH_SOURCE)" ] && \
    echo "***** executing $name_src as a shell script *****" || \
    echo "..... sourcing $name_src ....."

1) выход 0 выйдет из скрипта, если он успешен.

2) Выход 1 выйдет из скрипта, если это провал.

вы можете попробовать их выше двух на основе ur req.

Comments

    Ничего не найдено.