"su -c"를 실행하면 환경은 어떻게 되나요?

"su -c"를 실행하면 환경은 어떻게 되나요?

"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)있으므로 -cLinux에 있는 것처럼 보입니다. 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

관련 정보