0

私の Mac OS コマンド ライン アプリケーションは、次のような Unix 呼び出しを行っています。

system("rm -rf /Users/stu/Developer/file);

完全に成功しました。

では、なぜ以下は現在のディレクトリを変更しないのでしょうか?

system("cd /Users/me/whatever");
system("pwd");    //cd has not changed
4

1 に答える 1

4

なぜなら

system()を呼び出してcommandで指定されたコマンドを実行し、コマンドが完了すると戻ります。/bin/sh -c command

そのため、各コマンドはシェルの新しいインスタンスで個別に実行されます。

したがって、最初の呼び出しでsh(現在の作業ディレクトリを使用して) 新しいディレクトリが生成され、ディレクトリが変更されてから終了します。次に、2 番目の呼び出しがsh(再び CWD で) 新しいものを生成します。

のマニュアル ページをsystem()参照してください。


より良い解決策は、使用しないことsystemです。セキュリティの脆弱性にさらされる可能性のある固有の欠陥がいくつかあります。コマンドを実行する代わりにsystem()、同等の POSIX C 関数を使用する必要があります。 コマンドラインからできることはすべて、C 関数で実行できます (これらのユーティリティはどのように機能すると思いますか?)

  • これsystem("rm -rf ...")を使用する代わりに。
  • system("cd ...")使用する代わりにchdir()
  • system("pwd ...")使用する代わりにgetcwd()

もちろん、いくつかの違いはありますが、これらはあなたがやろうとしていることと基本的に同等です。

于 2013-07-11T01:43:55.180 に答える