"sudo: 소스: 명령을 찾을 수 없습니다"

"sudo: 소스: 명령을 찾을 수 없습니다"
$ 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편집: 또한 잘 작동하므로 다른 쉘이 사용되지 않는 것을 볼 수 있습니다 .

관련 정보