bash 대화형 및 대화형 로그인에 대해 읽고 있었는데 -l
옵션과 함께 bash를 실행하면 로그인 셸로 시작되지만 그렇게 한 후에도 echo $0
확인을 위해 명령을 실행하면 여전히 비로그인 셸로 표시됩니다.
[root@localhost ~]# bash -l
[root@localhost ~]# echo $0
bash
-
이는 쉘 이름의 접두어로 나타나야 합니다 . 제가 틀렸다면 확인해 주세요.
답변1
-
명령 이름의 첫 번째 문자로 an을 사용하는 것은 로그인 쉘에 신호를 보내는 한 가지 방법일 뿐이며 다른 신호도 있습니다. 실제로 현재 쉘이 로그인 쉘인지 여부를 감지하는 올바른 방법은 쉘 자체에 물어보는 것입니다.
Bash 매뉴얼에서:
로그인 쉘에 대한 인수가 없는 첫 번째 문자는 -이거나 --login 옵션으로 시작됩니다.
배쉬에서:
shopt -p login_shell
-u
쉘이 로그인되지 않은 경우 인쇄됩니다 -s
.
테스트해보자:
$ ln -s $(which bash) ./-bash # make a local copy of bash
$ PATH=$PATH:. # Big security problem, don't use it.
$ -bash # start the local copy of bash
$ echo $0 # Its name start with an -
-bash
$ shopt -p login_shell # Is it a login shell?
shopt -s login_shell # Yes!, the answer is -s
$ exit # leave the login shell
$ PATH=${PATH%:.} # Remove the local pwd from the path.
$ rm ./-bash # Remove the local copy of bash
$0에 -가 있다는 사실이 반드시 해당 쉘이 로그인 쉘이라는 것을 의미하지는 않습니다.
$ bash -c 'echo $0; shopt -p login_shell' -bash 1 2 3
-bash
shopt -u login_shell
매뉴얼에서 로그인 쉘을 얻는 또 다른 방법은 요청하는 것입니다:
$ bash --login # ask for a login shell
$ echo $0 # What is its name?
bash
$ shopt -p login_shell # Is it a login shell?
shopt -s login_shell # Yes, it is!
$ exit # leave the login shell.
답변2
로그인 쉘은 다음 두 가지 중 하나일 수 있습니다.
1- 인수 0의 첫 번째 문자는 "-"입니다.
2- --login 옵션으로 호출됩니다.
> echo $0
=if=> -bash # login shell.
=if=> bash # we don't know nothing!!!
> shopt -p login_shell
=if=> shopt -s login_shell # login shell.
=if=> shopt -u login_shell # non-login shell
또 다른 방법(이것은 추악한 방법입니다!)은 현재 쉘에서 종료하는 것입니다. 쉘이 로그인되어 있으면 출력은 로그아웃되고, 그렇지 않으면 그냥 종료합니다.
> bash
> shopt -p login_shell
shopt -u login_shell
> exit
exit # it says exit
> bash -l
> shopt -p login_shell
shopt -s login_shell
> exit
logout # it says logout
logout
비로그인 쉘에서는 이 작업을 수행할 수 없습니다.