"exit"를 사용하여 .bashrc에서 호출한 스크립트로 인해 로그인이 방지됨

"exit"를 사용하여 .bashrc에서 호출한 스크립트로 인해 로그인이 방지됨

나는 나 자신을 발견했다. 스크립트를 작성하고 에서 호출한 후 루트에 로그인할 수 없습니다 ~/.bashrc.

~/.bashrc:

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

~/myscript.sh:

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

내가 바랐던 것은 루트로 로그인하면 myscript.sh가 실행되고 myConditional이 true인 경우 myscript.sh가 더 이상의 명령 실행을 중지하지만 .bashrc로 돌아가서 사용자가 계속 로그인되어 있기를 바랐습니다. 평소처럼 루트로. 하지만 그 대신 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

원하는 효과로.

관련 정보