Я пишу программу, foo, на C ++. Обычно он вызывается из командной строки следующим образом:
foo *.txt
Мой main()
получает аргументы обычным способом. Во многих системах argv[1]
буквально *.txt
, и мне приходится вызывать системные подпрограммы, чтобы выполнить подстановочный знак. Однако в системах Unix оболочка расширяет подстановочный знак перед вызовом моей программы, и все совпадающие имена файлов будут в argv
.
Предположим, я хотел добавить параметр в foo, который заставляет его переходить в подкаталоги.
foo -a *.txt
обработает все текстовые файлы в текущем каталоге и все его подкаталоги.
Я не понимаю, как это сделать, поскольку к тому времени, когда моя программа получит шанс увидеть -a
, оболочка уже выполнит расширение, и пользовательский ввод *.txt
будет потерян. Тем не менее, существуют распространенные Unix-программы, которые работают таким образом. Как они это делают?
Как на земле Unix, как я могу контролировать расширение подстановочных знаков?
(рекурсивный просмотр в подкаталогах - это только один пример. В идеале я пытаюсь понять общее решение для управления расширением подстановочного знака.)