
"su -c"를 실행하면 환경은 어떻게 되나요?
내가 묻는 이유는 다음과 같은 신비한 행동 때문입니다.
bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:...
bash$ su - user -c "firefox ..."
-bash: firefox: command not found
어떤 아이디어가 있나요?
답변1
$PATH
당신이 보고 있는 것은 명령이 실행되기 전에 인수 처리 중에 첫 번째 사용자 셸에서 확장된다는 사실 su(1)
이므로 항상 그런 것처럼 보입니다. 큰 따옴표( )를 사용하면 'echo $PATH'
다른 내용이 표시되거나 그냥 를 사용해야 합니다 \$
.
$PATH
이렇게 하면 명령이 실행될 때까지 구문이 유지됩니다 su(1)
. 일반적으로 환경에 영향을 미치지 않지만 새 셸을 시작하므로 PATH=
다양한 셸 시작 스크립트에서 행을 확인해야 합니다.
귀하에게는 옵션이 su(1)
있으므로 -c
Linux에 있는 것처럼 보입니다. Mac이나 BSD에서는 PATH
로그인 대신 단순화된 메시지가 표시되지만 PATH
"언제 PATH를 확장했습니까?"라는 메시지는 여전히 동일합니다. 문제.
답변2
su -
또는를 사용 하면 su -l
환경을 깨끗한 상태로 재설정하는 로그인 세션을 에뮬레이트합니다.
Arch Linux에서는 su -
하드코딩된 문자열을 /usr/ucb:/bin:/usr/bin:/etc
새로운 $PATH
. 다른 시스템에서는 환경을 설정하기 위해 PAM ENV_SUPATH
에서 읽거나 PAM에 의존할 수 있습니다./etc/login.defs
su ... "echo $PATH"
거짓말입니다. 부품이 시작되기 $PATH
훨씬 전에 현재 셸에 의해 확장되었기 때문입니다. 대신 (작은따옴표 참고) 또는 (전체 환경을 인쇄함)을 su
사용하십시오 .su ... 'echo $PATH'
su - -c env