$ source /etc/environment
$ sudo source /etc/environment
[sudo] password for t:
sudo: source: command not found
bash
실행 중인 쉘이 실행 중인 쉘과 다른 것으로 보이며 해당 쉘에 대한 내장 기능이 source /etc/environment
없습니다 .source
하지만 나와 루트의 기본 쉘은 둘 다 bash
.
$ echo $SHELL
/bin/bash
sudo
다른 쉘을 사용한다면 그 이유는 무엇입니까 ? 나는 보았다slm의 답장, 하지만 제 경우에는 이해가 안 돼요.
답변1
source
쉘 내장 함수이므로 쉘 없이는 실행할 수 없습니다. 그러나 쉘은 기본적으로 실행되지 않습니다 sudo
. ~에서sudo
프로세스 모델
sudo는 명령을 실행할 때 fork(2)를 호출하고 위에서 설명한 대로 실행 환경을 설정한 다음 하위 프로세스에서 execve 시스템 호출을 호출합니다.
쉘을 명시적으로 실행하려면 -s
다음 옵션을 사용하십시오.
# sudo -s source /etc/environment
셸을 종료한 후 환경 변경 사항이 손실되기 때문에 여전히 작동하지 않습니다.
답변2
해당 지역에서질문에 답하기보다는 문제를 해결하라, 이는 루트만 읽을 수 있는 파일을 얻는 가장 확실한 방법입니다.
source <(sudo cat /etc/environment)
이는 다음을 사용합니다.프로세스 교체. 명령의 출력을 가져와 cat
의사 파일로 변환합니다. 이 파일을 source
.source에 전달한 다음 현재 셸에서 명령을 실행할 수 있습니다.
대부분의 시스템에서는 /etc/environment
누구나 읽을 수 있으므로~해야 한다이것을 실행할 수 있었습니다:
source /etc/environment
답변3
sudo
명령이 필요하지만 내장 셸을 제공했기 때문에 명령을 찾을 수 없습니다. type source
: 을 쓰면 출력을 볼 수 source is a shell builtin
있으며 출력은 which source
비어 있습니다.
예를 들어, strace는 명령이기 때문에 sudo strace
작동하고 출력을 제공합니다.which strace
sudo su;sudo source /etc/environment
편집: 또한 잘 작동하므로 다른 쉘이 사용되지 않는 것을 볼 수 있습니다 .