web-dev-qa-db-ja.com

C関数を使用してシェル組み込みコマンドを実行するにはどうすればよいですか?

Linuxコマンド「pwd」をexecv()などのC言語関数を介して実行したいと思います。

問題は、「pwd」という実行可能ファイルがなく、「echo $ PWD」を実行できないことです。これは、echoも組み込みのコマンドであり、実行可能ファイルが見つからないためです。

17
user2851770

_sh -c echo $PWD_を実行する必要があります。通常、_sh -c_はシェルコマンドを実行します。

(実際、system(foo)execl("sh", "sh", "-c", foo, NULL)として定義されているため、Shellビルトインで機能します。)

ただし、PWDの値だけが必要な場合は、getenvを使用します。

11
Kerrek SB

Cプログラムでシェルコマンドを実行するだけの場合は、次を使用できます。

   #include <stdlib.h>

   int system(const char *command);

あなたの場合、

system("pwd");

問題は、「pwd」と呼ばれる実行可能ファイルがなく、「echo $ PWD」を実行できないことです。echoは、見つかる

これはどういう意味ですか? / bin /で上記のパッケージを見つけることができるはずです

Sudo find / -executable -name pwd
Sudo find / -executable -name echo
23
smRaj

Exceclコマンドを使用できます

int execl(const char *path, const char *arg, ...);

ここに示すような

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

int main (void) {

   return execl ("/bin/pwd", "pwd", NULL);

}

2番目の引数は、プロセステーブルに表示されるプロセスの名前になります。

または、getcwd()関数を使用して現在の作業ディレクトリを取得できます。

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#define MAX 255

int main (void) {
char wd[MAX];
wd[MAX-1] = '\0';

if(getcwd(wd, MAX-1) == NULL) {
  printf ("Can not get current working directory\n");
}
else {
  printf("%s\n", wd);
}
  return 0;
}
6
PhillipD