Подстановочный знак не расширяется в рекурсивном cp с использованием execvp()

Хотя в пути "/home/abhijit/Documents/LINUX/editor/" есть несколько файлов, но я не получаю желаемого вывода в папке "temp" (которая должна скопировать все файлы из папки редактора), вместо этого выводится ошибка: "cp: невозможно определить '/home/abhijit/Documents/LINUX/editor/*': нет такого файла или каталога".

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

int main( void )
{
    char* argv1[10] = { "cp", "-rf", "/home/abhijit/Documents/LINUX/editor/*", "/home/abhijit/Documents/LINUX/temp", 0 };
    execvp( argv1[0], argv1 );
}

Но если я скажу, как показано ниже, он отлично работает.

 char* argv1[MAX_ARGS] = { "cp", "-rf", "/home/abhijit/Documents/LINUX/editor/", "/home/abhijit/Documents/LINUX/temp", 0 };

person Abhijit Sahu    schedule 04.07.2017    source источник
comment
Если вам нужна оболочка, вы можете использовать вместо нее system()   -  person Ctx    schedule 04.07.2017
comment
@BhargavRao - я пытался проголосовать за отмену ответа Абхиджита, но не могу из-за вашего статуса. Пожалуйста, простите меня за то, что я оспариваю ваше решение, но я думаю, что ответ Абхиджита должен оставаться в силе. У него есть полный код, и он дает ответ SomeProgrammerDude. Я думаю, что это лучше, чем ответ SomeProgrammerDude, потому что в ответе SPD отсутствует код.   -  person jww    schedule 05.07.2017
comment
Я твердо верю, что переполнение стека дает максимально полную информацию. BhargavRao - я полностью согласен с вами. Код, который я предоставил, представляет собой ПРОСТОЕ ИСПОЛЬЗОВАНИЕ execvp() и glob() для решения проблемы, и полное признание ответа идет на входы SomeProgrammerDude. В соответствии с точкой зрения SomeProgrammerDude следует использовать форк и exec, чего я не отрицаю. Кстати, я уже делал этот комментарий. По моему мнению, код, который я предоставил, не следует удалять, поскольку он передает основные функции того же самого для достижения результата. Пожалуйста, поправьте меня, если я ошибаюсь.   -  person Abhijit Sahu    schedule 05.07.2017


Ответы (1)


Шаблон звездочки * раскрывается оболочкой, а не самой командой cp.

Вы можете заставить его работать, если запустите команду cp через оболочку, либо вызвав оболочку с параметром -c через exec, либо используя system вместо exec.

person Some programmer dude    schedule 04.07.2017
comment
Спасибо за быстрый ответ. Да, через оболочку все работает нормально, как и ожидалось. Но, извините, я использую busybox без оболочки. Но как добиться в execvp() самого системного вызова? Есть ли возможность этого добиться? - person Abhijit Sahu; 04.07.2017
comment
@AbhijitSahu Если вы хотите использовать подстановочные знаки подстановки, вам либо нужно использовать оболочку, либо использовать glob функция и несколько команд cp (по одной на каждое совпадение). - person Some programmer dude; 04.07.2017
comment
Большое спасибо за вклад - Какой-то программист, чувак. Я обновил код в комментарии к ответу. Еще раз спасибо за помощь. - person Abhijit Sahu; 04.07.2017
comment
@AbhijitSahu Вы знаете, какие функции выполняет exec делать? Что они заменяют вашу программу на ту, которую вы пытаетесь exec? Функция exec возвращает значение только при ошибке. Возможно, вам также следует узнать о fork и идиома fork-exec. - person Some programmer dude; 04.07.2017
comment
Да, я это прекрасно знаю. Спасибо за разъяснения! На самом деле я использую fork(), обработчик sigchld_hdl с execvp() в своей кодовой базе. Вместо того, чтобы писать здесь fork() с целой длинной программой, я поднял вопросы с помощью простого примера execvp() - просто чтобы передать эту проблему с дикими символами. Спасибо. - person Abhijit Sahu; 04.07.2017