이 순서도 해석에서
나는 남자 배쉬에서 그것을 발견했다.
bash가 대화식 로그인 쉘 또는 –login 옵션을 사용하는 비 대화식 쉘로 호출되면 해당 파일이 존재하는 경우 먼저 / etc / profile 파일에서 명령을 읽고 실행합니다.
것을 그 상태 대화 형 로그인 쉘 읽기 /etc/profile
(–noprofile없이)
또한 read 옵션이있는 비 대화식 쉘--login
/etc/profile
즉 몇 가지 가능한 떠날 것 같다 로그인 쉘 (있는 $0
로 시작을 -
)되고 있음을 비 대화 형이 (어쩌면 간단 등의 스크립트를 실행 date
) 읽을 수 있습니다 (소스) /etc/profile
.
이 아이디어를 확인하거나 거부하려면
먼저을 사용 su -l -
하여 로그인 쉘을 -
첫 번째 문자로 시작했지만 비 대화식으로 만들지 못했습니다 (테스트를 표시하여 테스트 할 수 없음).
같은 것을 호출
$ bash -c 'date' -bash
로그인 쉘로보고하지 않습니다 (첫 번째 문자가 인 경우에도 -
).
세부 사항을 밝히려면 이것을 시도하십시오.
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
는
$0
A가 가지고-
첫 번째 문자로, 전혀 없다i
의 값 (상호 작용)$-
하지만이보고되지login_shell
합니다 (-u). 이 경우 / etc / profile을 읽지 못했지만 이것이 올바른 테스트인지 확실하지 않습니다.
이 질문에 ” 특별하지 않은 드문 비 대화식 로그인 쉘” 에 대한 언급도 있습니다 .
이 사람 의 결론/etc/profile
은 항상 읽었다 는 것 입니다.
요약 테이블 읽기 : 대화식 및 비 대화식 로그인 쉘 모두 읽기 /etc/profile
그리고, 경우 이 페이지에서 예 올바른지 :
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
읽은 exec su - bob -c 'env'
보고서 테스트 /etc/profile
.
한마디로 :
그것은 가질 수 있습니다 비 대화 형 로그인 (또는 -l –login 호출되지 않음) 쉘을?
그리고 사실이라면 /etc/profile
파일을 읽고 있습니까?
위의 내용이 사실이라면 모든 로그인 셸 (대화 형)이 / etc / profile ( --noprofile
옵션 없이 )을 읽는 다고 결론을 내립니다 .
참고 : / etc / profile을 읽고 있음을 감지하려면 파일의 맨 앞에 다음 명령을 추가하십시오.
echo "'/etc/profile' is being read"
답변
비 대화식 로그인 쉘은 드물지만 가능합니다. 0 번째 인수 (보통 실행 파일 이름)를 사용하여 셸을 시작하면으로 시작하는 문자열로 설정되며 -
대화식 여부에 관계없이 로그인 셸입니다.
$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB
bash -c date -bash
쉘이 로그인 쉘이라고 말하지 않기 때문에 시도 가 작동하지 않았습니다. 제로 인수는 bash
아닙니다 -bash
. bash가 시작된 후에는 변수 $0
를 -bash
0 번째 인수 대신으로 설정 하지만 0 번째 인수가 중요합니다.
당신이 가진 비 대화식 로그인 쉘 실행할 수 있습니다 su -l
또는 su -
, 그러나 당신은하지 터미널 동안은 여전히 수있는 권한을 부여하는 (암호를 입력 할 필요없이, 또는 암호의 시작이 될 수 있도록 배열로 표준 입력을 준비 할 필요가 입력). sudo true
존재 자격 증명을 얻기 위해 sudo : run 을 사용하는 것이 더 쉬울 수 있으며 자격 증명이 여전히 유효한 run echo 'shopt -p login_shell; echo $-' | sudo -i
입니다.
로그인 셸과 비 로그인 셸의 차이점을 참조하십시오 .
답변
다음과 같은 그래픽 로그인 환경을 보았습니다.
exec "$SHELL" -l -c 'exec start-window-or-session-manager'
또는 이에 상응하는 것 :
exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF
따라서 세션 초기화 파일 ( ~/.profile
Bourne과 같은 쉘 (및 /etc
일부 는 해당 쉘 ))을 읽고 적용 할 수 있습니다.
첫 번째는 모든 쉘에서 작동하지 않습니다. -l
은 많은 수의 쉘에서 지원하지만 전부 는 아니지만 csh
/ 과 같은 일부 tcsh
에서는와 함께 사용할 수 없습니다 -c
. 의 첫 번째 문자 argv[0]
의 존재는 -
그 무엇의로,하지만 모든 쉘에 의해 이해 login
가 로그인 쉘있는 쉘에게 사용합니다.
두 번째 경우, 해당 쉘의 stdin은 tty
장치 가 아닌 다른 것 ( <<
임시 일반 파일 또는 쉘에 따라 파이프로 구현 됨)이므로 쉘은 대화식이 아닙니다 (인간 상호 작용시 대화식 정의) 그것으로).
답변
예, 비대화 형 로그인 셸이 가능합니다
$ head -1 /etc/profile
echo PROFILE BEING READ
$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello
$
답변
비 대화식 로그인 셸을 사용할 수 있습니까 (–login 또는 -l과 함께 호출되지 않음)?
예.
$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')
그러나 인수가 제공 /etc/profile
되지 않으면 비 대화식 로그인 쉘에는 사용되지 않습니다 --login
.
비 대화식 로그인 셸을 호출하는 일반적인 관용구는 다음과 같습니다.
$ su - someuser -c somecommand
그러나 이것은 /etc/profile
실행되지 않는 사실을 겪습니다 .
이 동작을 변경할 수는 있지만 config-top.h 에있는 옵션의 주석 처리를 제거하여 컴파일시 Bash 소스 코드를 사용자 정의해야합니다 .
/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */
나는이 때 이 연구 su
이상 , 나는 다른 쉘을 포함 발견 zsh
하고 dash
이러한 차이가 없습니다.