Error: process caused \"exec: \\\"cd\\\": executable file not found in $PATH\"\n"}
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
実行する場所はどこですかcd
?
答え1
cd
ファイルシステムで実行可能なコマンドではありません(POSIX互換システムでは) は、現在の作業ディレクトリを変更するシェルの内部組み込みコマンドです。
現在の作業ディレクトリはプロセス固有の属性であるため、プロセスは現在の作業ディレクトリを変更するために子プロセスでコマンドを実行できません。
コマンドを実行するためにどの言語を使用しても、cd
現在の作業ディレクトリを変更するための独自のインターフェースがあります。
たとえば、次のようになります。
spawn_cmd("cd", "/some/dir");
あるいは、コマンドの実行に使用するコマンドが何であれ、C言語では次のものを使用します。
chdir("/some/dir")
chdir()
システムコール用のlibcインタフェースはどこにありますかchdir
?
Cで書いた場合は、次のように書きました。
system("cd /some/dir");
そうだろういいえ実際には次のようなことをするので、エラーを印刷します。
spawn_cmd("sh", "-c", "cd /some/dir");
つまり、シェル子プロセスがこのcd /some/dir
シェルコードを評価すると、シェルは組み込みcd
コマンドを呼び出して独自の現在の作業ディレクトリを変更します(ただし、コマンドを実行するためにプロセスを作成した親プロセスの現在の作業ディレクトリではありません)。
しかし、次のようにすることができます。
system("cd /some/dir && exec some-other-command");
それは次のとおりです。
spawn_cmd("sh", "-c", "cd /some/dir && exec some-other-command");
または、任意のディレクトリおよびコマンドの場合、シェルコードとして解釈されるリスクを回避するには、次の手順を実行します。
spawn_cmd("sh", "-c",
"unset -v CDPATH;"
"cd -P -- \"$1\" || exit;"
"shift;"
"exec \"$@\"", "sh", "/some/dir", "some-other-command");
その後、子プロセスが実行sh
されて作業ディレクトリが変更され、some-other-command
同じプロセスで子プロセスが実行されるため、新しい作業ディレクトリが使用されます。