2016-12-09 12 views
0

を使用して、単純なbashコマンドを実行しようとしています。コードはlsgeditechoなどのコマンドでは機能しますが、cdコマンドで失敗します。Cコードを使用してBashコマンドを実行する

[email protected]:~/Desktop$ g++ -Wno-write-strings file.cpp -o file 
[email protected]:~/Desktop$ ./file 
[email protected]:~/Desktop$ 

現在のディレクトリが/etcに変更していない、私は./fileを使用してコンパイルした後、それを実行し、私の端子出力がある

#include <stdio.h> 
#include <unistd.h> 

int main() { 
    char *cd[] = { 
     "/bin/bash", 
     "-c", 
     "cd /etc", 
     NULL 
    }; 
    execvp(cd[0], cd); 
    return 0; 
} 

は、ここに私のfile.cppです。私はcd /etccd ..に変更しようとしましたが、cd some_directoryfile.cppになりましたが、成功しませんでした。

私が間違っていることを指摘してください。

+2

'exec'タイプのコマンドは通常、自分の環境で実行されます。のように、彼らはあなたがそれらから呼び出されたプロセスのような、他の何にも影響しません。 – Iluvatar

答えて

2

各プロセスには独自のカレントディレクトリがあります。

/bin/bash -c "cd /etc"を実行すると、Bashが起動し、現在のディレクトリが変更されて終了します。これは、execforkexecsystemのいずれで実行しても、シェルなどで入力しても関係ありません。

実行したシェルの現在のディレクトリには影響しません。

+0

現在の端末セッションでこれらの変更を確認する方法はありますか? – Rahul

+0

@ラフールいいえありません。 – immibis

+1

no - 現在のセッションに変更がないためです。あなたがしようとしていることをすることはできません。 'cd'はシェルに組み込まれたコマンドで、プログラムではない(vs' ls'や 'mkdir') – pm100

関連する問題