![echoがシェル組み込み関数であるにもかかわらず、「$sudo echo 'yo'」がまだ機能するのはなぜですか? [コピー]](https://linux33.com/image/57664/echo%E3%81%8C%E3%82%B7%E3%82%A7%E3%83%AB%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%81%AB%E3%82%82%E3%81%8B%E3%81%8B%E3%82%8F%E3%82%89%E3%81%9A%E3%80%81%E3%80%8C%24sudo%20echo%20'yo'%E3%80%8D%E3%81%8C%E3%81%BE%E3%81%A0%E6%A9%9F%E8%83%BD%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
私は理解
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
オペレーティングシステムでの成功ではなく失敗に関するものですsudo echo
。
sudo cd /directory
root
これは、特定のユーザー(おそらくここ)がcd
特定のディレクトリにアクセスできることを確認する非常に合法的な方法です。そのため、すべてのPosix互換オペレーティングシステムはする実行可能なバージョンが提供されていますcd
。
したがって、あなたの質問への答えはシェルエイリアスと実行可能コマンドによって提供されるsudo echo yo
ため、設計どおりに動作しますが、オペレーティングシステム(おそらくGnu / Linuxベース)が中断されたためではありません。echo
sudo cd /directory
Posix 標準この特別なケースでは。
システムの簡単な解決策は、次を実行することです。sudo sh -c "cd /directory"