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 cdOS でsudo echo成功することよりも失敗することにあります。

sudo cd /directoryこれは、特定のユーザー(おそらくrootここにいる)が、あるディレクトリへのアクセスを許可されているかどうかを確認するための、かなり正当な方法ですcd。これが、すべてのPosix準拠OSがするの実行可能バージョンを提供しますcd

したがって、あなたの質問に対する答えは、シェルエイリアスと実行可能コマンドの両方によって提供されるsudo echo yoため設計上機能しますが、おそらくGnu / LinuxベースのOSが壊れているため機能しません。echosudo cd /directoryPOSIX標準この特定のケースでは。

あなたのシステムでの簡単な回避策は、sudo sh -c "cd /directory"

関連情報