моя системная функция выполняет переданную строку отдельно

#c #bash #c-strings

#c #bash #c-строки

Вопрос:

Я пытался передать строку в другую строку для выполнения system() команды, но она выполняет строку отдельно «sudo ifconfig %s», затем «down». Я надеюсь, что кто-нибудь может объяснить мне, что происходит.

Код:

 int main() 
{
    char wlanint[200];
    char ifconfig[3200];

    system("clear");
    printf("n");
    printf("Here are your wlan interfaces:nn");
    system("iw dev | awk '$1=="Interface"{print $2}'");
    printf("nnWlan interface to change the mac: ");

    fgets(wlanint, 200, stdin);

    snprintf(ifconfig, 3200, "sudo ifconfig %s down",wlanint);
    system(ifconfig);

    getchar();

    return 0;
}
  

Вывод:

 Here are your wlan interfaces:

wlx7cdd90f63905


Wlan interface to select: wlx7cdd90f63905
wlx7cdd90f63905: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.9  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 3a:d1:3a:86:1b:a5  txqueuelen 1000  (Ethernet)
        RX packets 151033  bytes 153673265 (153.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7047855  bytes 447465001 (447.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

sh: 2: down: not found
  

Комментарии:

1. fgets() переносит завершающую новую строку входной строки в предоставленный буфер. Вы копируете ее вперед к следующей команде, и оболочка интерпретирует ее как разделитель строк.

2. В целом, однако, похоже, что вы действительно хотите писать сценарий оболочки. C — очень неудобный способ сделать это.

3. @JohnBollinger Я на самом деле пытался добавить этот код в большую кучу кода для чего-то другого, написанного на C. Вот почему я использую C для запуска этой команды bash. Ну, включение файла bash только для этого не показалось мне отличной идеей. Тем не менее, вы бы порекомендовали мне включить файл bash вместо того, чтобы прилагать такие усилия.

4. Я, вероятно, не стал бы встраивать скрипт bash в более крупный проект C. Я бы уделил особое внимание предоставлению внешнего вспомогательного скрипта, с помощью которого программа будет выполняться system() . Но, в конечном счете, я недостаточно знаю о масштабах, характере и требованиях вашего более крупного проекта, чтобы дать твердую рекомендацию.