echo가 쉘 내장 함수임에도 불구하고 "$ sudo echo 'yo'"가 여전히 작동하는 이유는 무엇입니까? [복사]

echo가 쉘 내장 함수임에도 불구하고 "$ sudo echo 'yo'"가 여전히 작동하는 이유는 무엇입니까? [복사]

나는 이해

sudo cd /directory

다음을 반환합니다:

sudo: cd: command not found

cd는 바이너리 파일이 아닌 쉘 내장 명령이기 때문입니다. 그런데 왜

sudo echo 'this is a test'

잘 지내?

여기서 무슨 일이 일어나고 있는 걸까요? 쉘이 아닌 경우 sudo명령을 어떻게 찾을 수 있습니까?echo

답변1

이유는 간단합니다. cd이는 쉘 내장 함수(일부 쉘에서는 쉘 함수)이고 echo바이너리 파일이자 쉘 내장 함수입니다.

$ type -a cd  
cd is a shell builtin
$ type -a echo 
echo is a shell builtin
echo is /bin/echo

sudo쉘 내장은 처리할 수 없지만 처리할 수는 있습니다 . 를 $PATH사용하면 에서 발견되므로 이를 사용하고, 에서 발견되지 않으므로 실패합니다.sudo echo/bin/echo$PATHsudo cdcd$PATH

답변2

달리기

 which echo

주어진

 /bin/echo

echo정상적인 프로그램이며 sudo"찾을" 수 있습니다.

참고로 몇 가지 옵션이 있어야 합니다.sudoers(5)

답변3

문제는 sudo cd운영 체제에서의 성공보다는 실패 에 관한 것입니다 sudo echo.

sudo cd /directoryroot이는 특정 사용자(아마 여기)가 cd특정 디렉토리에 액세스 할 수 있는지 확인하는 매우 합법적인 방법입니다 . 그렇기 때문에 모든 Posix 호환 운영 체제는하다실행 가능한 버전이 제공됩니다 cd.

따라서 귀하의 질문에 대한 답변은 쉘 별명 및 실행 가능 명령에 의해 제공되기 sudo echo yo때문에 설계된 대로 작동 하지만 운영 체제(아마도 Gnu/Linux 기반)가 중단되었기 때문이 아닙니다.echosudo cd /directoryPosix 표준이 특별한 경우에는.

시스템의 간단한 해결 방법은 다음을 실행하는 것입니다.sudo sh -c "cd /directory"

관련 정보