複数のパスを含む配列を見て、配列にリストされているディレクトリのいずれかにコマンド (ls、wc、cat ... など) が存在するかどうかを確認するアルゴリズムがあります。いずれかのディレクトリでファイルが見つかった場合は、完全なディレクトリ パスを返します。
char *LookupPath(char **argv, char **dir)
{
/* String Name To Be Returned */
char *result;
char path_name[MAX_PATH_LEN] = {0};
int i;
/* Check To See If File Name Is Already An Absolute Path Name */
if(*argv[0] == '/') {
}
/* Look In Path Directories */
for(i = 0; dir[i] != NULL; i++) {
strncat(path_name, dir[i], sizeof(path_name));
strncat(path_name, "/", sizeof(path_name));
strncat(path_name, argv[0], sizeof(path_name));
printf("pathname: %s\n", path_name);
result = path_name;
if(access(result, F_OK) == 0) {
printf("SUCCESS!\n");
printf("result: %s\n", result);
return result;
}
path_name[0] = '\0';
}
/* File Name Not Found In Any Path Variable */
return NULL;
}
新しい問題: ls -l などのコマンドを使用すると、以下の結果コードに示すように結果が美しく機能します。
pathname: /usr/lib/lightdm/lightdm/ls
pathname: /usr/local/sbin/ls
pathname: /usr/local/bin/ls
pathname: /usr/sbin/ls
pathname: /usr/bin/ls
pathname: /sbin/ls
pathname: /bin/ls
SUCCESS!
result: /bin/ls
しかし、今、「ls」などの単純なコマンドを使用するとオンになります...結果はfalseです...何らかの理由で改行文字がlsに追加されるため...?現れる:
pathname: /usr/lib/lightdm/lightdm/ls
pathname: /usr/local/sbin/ls
pathname: /usr/local/bin/ls
pathname: /usr/sbin/ls
pathname: /usr/bin/ls
pathname: /sbin/ls
pathname: /bin/ls
pathname: /usr/games/ls
pathname: /usr/local/games/ls
ls
: Command Not Found!
どうしてか分かりません。「ls」だけに切り詰める方法はありますか。単純な ls コマンドであるのに、改行文字が argv[0] に追加される理由がわかりません。:S