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에서 발견되므로 $PATH이를 사용하지만 에서는 sudo cd찾을 수 없으므로 실패합니다.cd$PATH

답변2

달리기

 which echo

준다

 /bin/echo

echo일반 프로그램이며 sudo"찾을" 수 있습니다.

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

답변3

문제는 성공하는 sudo cd것보다 OS에서 실패하는 것이 더 많습니다 sudo echo.

sudo cd /directory이는 아마도 root여기에서 특정 사용자가 cd일부 디렉토리에 액세스할 수 있는지 확인하는 매우 합법적인 방법입니다. 이것이 모든 Posix 호환 OS가하다의 실행 가능한 버전을 제공합니다 cd.

따라서 귀하의 질문에 대한 대답은 쉘 별칭과 실행 가능한 명령 모두에 의해 제공되기 sudo echo yo때문에 의도적으로 작동 하지만 Gnu/Linux 기반 OS가 중단되었기 때문에 작동하지 않습니다.echosudo cd /directory포식스 표준이 특별한 경우에는.

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

관련 정보