2016-07-09 14 views
6

Tôi muốn thực hiện lệnh ls -a sử dụng execv() trên một máy Linux như sau:Làm cách nào để chạy 'ls' với các tùy chọn từ chương trình C?

char *const ptr={"/bin/sh","-c","ls","-a" ,NULL}; 
execv("/bin/sh",ptr); 

Tuy nhiên, lệnh này không liệt kê các tập tin ẩn. Tôi đang làm gì sai?

+0

Bạn sẽ nhận được gì nếu bạn thực hiện 'sh -c ls -a' (giống như' "sh" "-c" "ls" "-a" ') tại dấu nhắc trình bao? –

Trả lời

9

Tôi không chắc tại sao bạn chuyển số này qua /bin/sh ... nhưng vì bạn đang có, bạn cần chuyển tất cả các đối số sau -c dưới dạng giá trị duy nhất vì hiện tại chúng được hiểu là /bin/sh.

Ví dụ là so sánh cú pháp của vỏ

/bin/sh -c ls -a 

để

/bin/sh -c 'ls -a' 

Các công trình thứ hai, nhưng là người đầu tiên không.

Vì vậy, bạn ptr nên được định nghĩa là

char * const ptr[]={"/bin/sh","-c","ls -a" ,NULL}; 
+1

Bạn bị bắt hai, nhưng bỏ lỡ một phần ba. 'ptr' không được khai báo là đúng loại. – JdeBP

+2

Lưu ý rằng một trình bao không cần thiết để gọi một lệnh bên ngoài: bạn chỉ có thể sử dụng '{"/bin/ls "," -a ", NULL}'. – deltab

+0

@JdeBP - vị trí tốt; cố định :-) –

5

Nếu bạn cần phải nhận được nội dung của một thư mục từ một chương trình , thì đây không phải là cách tốt nhất - bạn có hiệu quả sẽ phải phân tích đầu ra của ls, là generally considered a bad idea.

Thay vào đó, bạn có thể sử dụng các chức năng libcopendir()readdir() để đạt được điều này.

Dưới đây là một chương trình ví dụ nhỏ mà sẽ lặp qua (và list) tất cả các file trong thư mục hiện:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <dirent.h> 

int main (int argc, char **argv) { 
    DIR *dirp; 
    struct dirent *dp; 

    dirp = opendir("."); 
    if (!dirp) { 
     perror("opendir()"); 
     exit(1); 
    } 

    while ((dp = readdir(dirp))) { 
     puts(dp->d_name); 
    } 

    if (errno) { 
     perror("readdir()"); 
     exit(1); 
    } 

    return 0; 
} 

Lưu ý việc niêm yết sẽ không được sắp xếp, không giống như mặc định ls -a đầu ra.

Các vấn đề liên quan