Когда вы введете ls -l *.c
, оболочка проанализирует эту команду, найдет шаблон глобуса и развернет его. Затем он вызовет ls
с расширенным списком аргументов, вызовет execvp
с массивом, подобным {"ls", "-l", "a.c", "b.c", "c.c", NULL}
. Ни ls
, ни execvp
сами по себе не расширяют глобусы, это делает оболочка.
Так что, если вы хотите использовать глобусы, вы можете либо расширить их самостоятельно (либо вручную выполнить текущий каталог и добавление всех файлов, которые заканчиваются на .c
, в ваш массив или с помощью функции glob POSIX), или go через оболочку. Вы можете сделать последнее либо явным вызовом, используя {"sh", "-c", "ls -l *.c", NULL}
в качестве массива, который вы передаете execvp
(или аналогично, но без массива, используя execl
et c.), Либо вы можете использовать system("ls -l *.c")
, который всегда проходит через оболочку.
Обратите внимание, что вы определенно не хотите go проходить через оболочку, если аргументы содержат ненадежный пользовательский ввод, поэтому в этом случае вы расширяете глобусы самостоятельно / используя glob
будет путь к go.