.bashrc "exit"로 호출된 스크립트는 로그인을 차단합니다.

.bashrc "exit"로 호출된 스크립트는 로그인을 차단합니다.

스크립트를 작성하고 에서 호출한 후에 루트로 로그인할 수 없다는 사실을 깨달았습니다 ~/.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

원하는 효과를 얻으세요.

관련 정보