통역하다이 흐름도
나는 man bash에서 다음을 발견했습니다.
bash가 --login 옵션을 사용하여 대화형 로그인 셸 또는 비대화형 셸로 호출되면 먼저 /etc/profile 파일(파일이 있는 경우)에서 명령을 읽고 실행합니다.
이는 다음을 나타냅니다.대화형 로그인셸 읽기 /etc/profile
(--noprofile 제외)
반품,비대화형옵션 --login
읽기 가 포함된 쉘/etc/profile
이것은 약간의 가능성을 남겨둔 것 같습니다.로그인쉘( $0
로 시작 -
)비대화형(아마도 이것처럼 간단한 스크립트를 실행하면 date
) (source)를 읽지 못할 수도 있습니다 /etc/profile
.
아이디어를 확인하거나 거부합니다.
su -l -
먼저 a를 첫 번째 문자로 사용하여 로그인 셸을 시작하는 를 사용해 보았지만 -
이를 비대화형으로 만드는 데 실패했습니다(그리고 이를 감지하는 테스트를 제공할 수 있었습니다).
다음과 같이 전화하십시오.
$ 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 입니다. 이는 값에-
(대화식으로) 존재하지 않지만 a(-u)로 보고되지 않습니다. 이 경우 /etc/profile은 읽혀지지 않지만 이것이 올바른 테스트인지는 확실하지 않습니다.i
$-
login_shell
또한 "희귀한 비대화형 로그인 쉘"도 언급되어 있습니다.이 답변에서이 질문에 대해서는 구체적이지 않습니다.
이것이 사람의 결론항상 읽혀 집니다 /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 [email protected] # interactive login shell, `~/.profile`
$ ssh [email protected] env # non-interactive non-login shell, `~/.bashrc`
exec su - bob -c 'env'
읽은 보고서를 테스트합니다 /etc/profile
.
간단히 말해서:
가질 수 있습니까?비대화형 로그인쉘(--login 또는 -l 없이 호출됨)?
/etc/profile
true인 경우 파일을 읽고 있습니까 ?
위의 내용이 사실이라면 다음과 같이 결론을 내려야 합니다.모두로그인 쉘[대화형(또는 비대화형)]은 /etc/profile을 읽습니다( --noprofile
옵션 없음).
참고: /etc/profile을 읽고 있는지 확인하려면 파일 시작 부분에 다음 명령을 추가하면 됩니다.
echo "'/etc/profile' is being read"
답변1
그래픽 로그인 환경이 다음을 수행하는 것을 보았습니다.
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
( <<
임시 일반 파일 또는 쉘 종속 파이프로 구현됨)가 아니므로 쉘은 대화형이 아닙니다(대화형의 정의는 사람이 상호 작용할 때입니다).
답변2
예, 비대화형 로그인 셸을 사용할 수 있습니다.
$ head -1 /etc/profile
echo PROFILE BEING READ
$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello
$
답변3
비대화형 로그인 쉘은 덜 일반적이지만 가능합니다. 0번째 인수(일반적으로 실행 파일 이름)를 a로 시작하는 문자열로 설정하여 쉘을 시작하면 -
대화형인지 여부에 관계없이 로그인 쉘입니다.
$ 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
대신 0 번째 인수는 입니다 -bash
. Bash가 시작되면 변수를 0번째 인수가 아닌 $0
로 설정 -bash
하지만 0번째 인수가 중요합니다.
su -l
비대화형 로그인 셸을 사용하거나 실행할 수 있지만 su -
표준 입력이 터미널이 아닌 다른 것이 되도록 준비하면서 인증을 받을 수 있어야 합니다(비밀번호를 입력하거나 시작 부분에 비밀번호를 정렬하지 않고). 입력). sudo: run을 사용하여 자격 증명을 가져온 sudo true
다음 자격 증명이 여전히 유효한 동안 실행하는 것이 더 쉬울 수 있습니다 echo 'shopt -p login_shell; echo $-' | sudo -i
.
당신은 또한 볼 수 있습니다로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?
답변4
비대화형 로그인 쉘(--login 또는 -l로 호출되지 않음)을 가질 수 있습니까?
예.
$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')
그러나 /etc/profile
인수가 제공되지 않는 한 비대화형 로그인 쉘에는 사용되지 않습니다.--login
비대화형 로그인 셸을 호출하는 일반적인 관용어는 다음과 같습니다.
$ su - someuser -c somecommand
/etc/profile
그러나 이는 구현되지 않았다는 사실에 직면합니다.
이 동작은 변경될 수 있지만 소스 코드에 있는 옵션의 주석 처리를 제거하여 컴파일 타임에 Bash를 사용자 정의해야 합니다.구성-top.h:
/* 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
포함하지 않는 다른 껍질을 발견했습니다.