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"

関連情報