`--login` 옵션으로 호출된 로그인 셸에서 $0에 단일 하이픈이 표시되지 않는 이유는 무엇입니까?

`--login` 옵션으로 호출된 로그인 셸에서 $0에 단일 하이픈이 표시되지 않는 이유는 무엇입니까?

man bash설명하다,

 A login shell is one whose first character of argument zero is a -,  or
 one started with the --login option.

Cygwin에서 터미널을 호출하면 mintty -$0이 하이픈( -)으로 시작하는 것을 볼 수 있습니다.

$ echo $0
-bash

그러나 옵션을 사용하여 로그인 쉘을 호출하면 --login이를 볼 수 없습니다 -.

$bash --login
$echo $0
bash

내 질문은 다음과 같습니다

  1. 의 기능은 무엇입니까 -? 호출된 로그인 셸에서는 이를 볼 수 없지만 --login관련 셸 옵션(예 shopt -q login_shell: . 무엇에 사용됩니까?) 을 쿼리할 수 있습니다.

  2. 중요한 역할이 있는 경우 -로그인 쉘이 호출될 때 이를 볼 수 없는 이유는 무엇입니까 --login?

  3. 로 시작하는 인수가 없는 로그인 쉘을 수동으로 호출하려면 어떻게 해야 합니까 -?

  4. zsh 및 csh와 같은 다른 쉘에서도 마찬가지입니까?

답변1

프로세스 이름의 선행 대시( argv[0]정확하게 말하면 in)는 login셸(또는 기타 유사한 프로세스)을 호출한 프로세스에 의해 배치됩니다. 이는 로그인 쉘(읽기 등) 역할을 해야 함을 쉘 프로그램에 알려줍니다 .profile. 쉘 프로그램은 다른 상황에서 로그인 쉘로 작동하도록 선택할 수 있습니다(예를 들어 -l명령줄 옵션이 전달되면 bash 및 zsh는 로그인 쉘로 작동합니다).

귀하의 질문에 답변하려면:

  1. 목적은 -쉘이 로그인 쉘 역할을 하도록 지시하는 것입니다. Bash의 경우 --login명령줄을 전달하는 것은 동일합니다.
  2. 너는 볼 수있어성격-Bash에서 옵션을 사용하여 호출됩니다. 등을 --login읽습니다 . bash가 as로 호출되지 않기 때문에 bash가 as로 호출되는지 여부를 알 수 ~/.profile없습니다 .-bashbash --login-bash-bash
  3. 일반적인 쉘에서는 0번째 인수를 선택할 수 없으며 명령 이름이어야 합니다. zsh를 사용하면 , 또는 를 사용 ARGV0=-bash bash하여 다음을 수행할 수 있습니다 . 또는 에서 이 작업을 수행할 수 있습니다 . 그런 일은 처음부터 시작해야 하는 일이기 때문에 할 수 없습니다 . 이렇게 할 수는 있지만 앞서 추가된 불쾌한 부작용이 있을 것입니다.ksh93bashzsh(exec -a -bash bash)mkshzshhash -- -bash=/bin/bash; -bashln -s /bin/bash ./-bash; ./-bashargv[0]-PATH=:$PATH; -bash""$PATH
  4. 예.

당신은 또한 볼 수 있습니다로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?

답변2

질문 1과 2

man bash귀하의 질문의 일부로 매뉴얼 페이지에 다음과 같이 나와 있습니다.또는. 따라서 로그인 쉘을 시작하는 두 가지 방법이 있습니다.

  • 매개변수 0의 첫 번째 문자는 입니다 -.
  • --login 옵션으로 시작하십시오.

그리고 두 가지 방법은 서로 독립적입니다. 인수 0의 첫 번째 문자는 a의 쉘입니다.- ~ 해야 하다로그인 쉘입니다. 그러나 매개변수 0의 첫 번째 문자 -는 로그인 쉘일 수도 있고 아닐 수도 있는 정적 쉘이 아닙니다 . 를 사용하여 호출하면 로그인 쉘이 됩니다 --login.

로그인 쉘을 확인하는 또 다른 방법:

$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches

질문 3

간단한 방법:

$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell

질문 4

AFAIK, zsh이 예와 동일합니다 csh.bash

관련 정보