PATHにないCDファイルを実行できません。

PATHにないCDファイルを実行できません。
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同じプロセスで子プロセスが実行されるため、新しい作業ディレクトリが使用されます。

おすすめ記事