
Я поймал себя на мысли: я не мог войти в систему под учетной записью 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
с желаемым эффектом.