* .txtワイルドカードの実行に問題があり、このスレッド(exec()、Cの任意のコマンド)を読み取ると、「グロブ」の問題のために困難であることがわかります。これを回避する簡単な方法はありますか?
これが私がやろうとしていることです:
char * array[] = {"ls", "*.txt", (char *) NULL };
execvp("ls", array);
次のシステムコマンドを使用できます。
system("ls *.txt");
シェルにグロブを実行させます。
この質問に答えるにls *.txt
は、端末(エミュレーター)を入力したときに何が起こっているのかを理解する必要があります。コマンドを入力するls *.txt
と、によって解釈されますshell
。次に、ディレクトリリストを実行し、ディレクトリ内のファイル名をパターンshell
と照合します。*.txt
上記のすべてが完了した後でのみ、すべてshell
のファイル名を引数として準備し、それらのファイル名をargv
配列としてexecvp
呼び出して渡す新しいプロセスを生成します。
そのようなものを自分で組み立てるには、次のQ/Aを見てください。
fnmatch()
ファイル名をシェルのようなワイルドカードパターンと一致させるために使用します。vfork()
1つを使用して別のプログラムを実行します。exec(3)
system()
または、 @manu-fattoが提案した関数を使用することもできます。しかし、その関数は少し異なることをします—それは実際にステートメントをshell
評価するプログラムを実行し、ls *.txt
それは次に私が上で説明したものと同様のステップを実行します。効率が低下する可能性があり、セキュリティホールが発生する可能性があります(詳細についてはマニュアルページを参照してください。セキュリティリスクは注記セクションに記載されており、特定の場合には上記の機能を使用しないことをお勧めします)。
それが役に立てば幸い。幸運を!