Что означает `$*` (знак доллара, за которым следует звездочка) в настройке по умолчанию `grepprg` в vim?

В ванильном vim на Mac, когда я набираю :set grepprg?, он возвращает следующее:

grepprg=grep -n $* /dev/null.

Я понимаю, что означают -n и /dev/null, благодаря старому вопросу здесь. Я также понимаю, что означают $ и * по отдельности. Однако я не уверен, что делать с $*. Я попытался найти его в документе vim, но все, что я смог найти, это

Заполнитель $* может указывать, куда будут включены аргументы.

Я чувствую, что упускаю здесь какую-то важную связь. Я был бы очень признателен, если бы кто-нибудь объяснил мне, как $* работает в качестве заполнителя.

Обновление: благодаря подробному объяснению от @romainl я понял, что неправильно интерпретировал $* как регулярное выражение, тогда как они являются частью соглашения в сценарии оболочки. На самом деле уже существует старый пост об этом конкретном соглашении. Дурак я!


person chunyun    schedule 22.04.2021    source источник


Ответы (1)


Я не уверен, какое объяснение необходимо помимо того, что вы уже процитировали:

Заполнитель $* может указывать, куда будут включены аргументы.

$* — это просто заполнитель, и он работает как все заполнители: перед фактической отправкой в ​​​​оболочку команда строится из &grepprg и $*, если присутствует, заменяется любым шаблоном, именем файла, флагами, и т.д., предоставленные пользователем.

Допустим, вы хотите найти foo\ bar во всех файлах JavaScript в текущем каталоге. Команда будет:

:grep 'foo\ bar' *.js

После того, как вы нажмете <CR>, Vim захватит любой аргумент, который вы передали :grep, в данном случае:

'foo\ bar' *.js

затем, если в &grepprg есть $*, он заменяется данным аргументом:

grep -n 'foo\ bar' *.js /dev/null

или, если в &grepprg нет $*, к нему добавляется данный аргумент, и только потом отправляет всю команду в шелл.

$* означает, что в этой команде я специально хочу, чтобы аргументы, предоставленные пользователем, появлялись здесь.

Что касается значения $*$ и * не имеют внутреннего значения, а $* могло быть $$$PLACEHOLDER$$$ или что-то в этом роде. $* мог быть выбран потому, что он используется в сценарии оболочки для представления всех аргументов, переданных функции или сценарию, что несколько близко по смыслу к тому, что происходит в &grepprg с $*.

person romainl    schedule 22.04.2021
comment
Большое спасибо за подробное объяснение! Думаю, я слишком много думал о $*. Когда я сказал, что понимаю, что они означают в своем исходном сообщении, я интерпретировал их по отдельности как $ --- конец строки и * --- ноль или несколько экземпляров символа слева от него, как в регулярном выражении. Но, видимо, я не знал об обычном использовании $* в сценарии оболочки. - person chunyun; 22.04.2021