Скрипт, вызываемый .bashrc с "exit", предотвращает вход в систему

Скрипт, вызываемый .bashrc с "exit", предотвращает вход в систему

Я поймал себя на мысли: я не мог войти в систему под учетной записью root после того, как создал скрипт и вызвал его из ~/.bashrc.

~/.bashrc:

#... do stuff then run my script
source ~/myscript.sh

~/myscript.sh:

#!/bin/bash
if [myConditional]; then
  exit
fi
# otherwise do stuff

Я надеялся, что когда я войду в систему как root, myscript.sh будет запущен, и если myConditional будет истинным, myscript.sh прекратит выполнение дальнейших команд, но вернется в .bashrc, и пользователь все равно будет входить в систему как root, как обычно. Но вместо этого exitя вообще не смог войти в систему! Он просто вернул меня к приглашению на вход.

Есть ли другая команда, которую я должен использовать помимо exit? Очевидно, я мог бы просто расширить ifоператор, добавив elseоператор и удалив exit, но в образовательных целях я хотел бы узнать, есть ли более подходящий подход. (Также отчасти потому, что я хочу избежать глубоко вложенных ifоператоров; это может быть довольно большой скрипт)

решение1

source filename.sh(или . filename.sh) запускает содержимоеfilename.sh в текущем интерпретаторе(по сути, как если бы вы скопировали содержимое в этой точке). Следовательно, exitзавершит работу интерпретатора.

Если вы просто хотите запустить скрипт как отдельную программу, не используйте source: просто ~/myscript.shзапустит его, если вы сначала сделаете его исполняемым с помощью chmod +x ~/myscript.sh, или вы можете использовать , bash ~/myscript.shесли предпочитаете. Это запускает новую оболочку для запуска вашего скрипта, как если бы это была любая другая программа в системе.

С другой стороны, если вы действительно хотите, чтобы sourceваш скрипт был выполнен правильно (например, потому что он будет устанавливать переменные окружения), вы можете остановить выполнение оставшейся части файла, не влияя на .bashrcоболочку, которая его запустила.с использованиемreturn:

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

В этом случае ваш myscript.shфайл будет иметь:

if [[ condition ]]
then
    return 0
fi

с желаемым эффектом.

Связанный контент