Ответ 1
Оболочка заменяет звездочку именем каждого файла в каталоге.
Чтобы передать буквенную звездочку, вы можете ее избежать:
$ ./a.out 123 \*
Скажем, у меня есть программа на C, и я запускаю ее из bash:
$ ./a.out 123 *
Программа выводит все аргументы командной строки, но он будет показывать их вместо:
Argument 1: 123 Argument 2: a.out
Что я могу сделать в своей программе, чтобы исправить это?
Оболочка заменяет звездочку именем каждого файла в каталоге.
Чтобы передать буквенную звездочку, вы можете ее избежать:
$ ./a.out 123 \*
Вы можете процитировать его в оболочке
./a.out 123 '*'
Вы ничего не можете сделать в своей программе, потому что расширение * выполняется оболочкой (в отличие от Windows, где она выполняется программой).
Другой вариант - использовать set -f
, чтобы отключить расширение. Для сравнения:
echo *
против
set -f
echo *
Это не имеет ничего общего с вашей программой.
*
является подстановочным знаком в Bash, это означает "все файлы в текущем каталоге". Если вы хотите передать звездочку в качестве аргумента вашей программе, вы делаете ее так же, как и с любой другой программой: вы избегаете ее с помощью обратной косой черты или цитируете ее.
Другой альтернативой является запуск script с #!/bin/bash -f
в качестве первой строки, которая позволит вам принимать литеральные строки в качестве аргументов (включая звездочку) и, таким образом, позволит вам запустить ./a.out 123 *
с помощью нужный ввод, но обратите внимание, что bash -f
полностью отключает разложения и может иметь неблагоприятные последствия в вашем script в зависимости от того, что вы делаете.