という事は承知しています
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が壊れているため機能しません。echo
sudo cd /directory
POSIX標準この特定のケースでは。
あなたのシステムでの簡単な回避策は、sudo sh -c "cd /directory"