Есть ли способ отключить интерполяцию звездочки * для определенных команд bash?

Я хотел бы иметь возможность записать * в свой сценарий, и чтобы получить * как есть (т.е. без расширения).

Bash попытается заменить его локальными файлами, соответствующими этому шаблону, и если этот шаблон не существует, bash передаст звездочку без модификации.

например

myscript --arg *   --- will pass local files to the script
myscript --arg=*   --- will pass "--arg=*", since there are no filenames starting with "--arg=<...>"

Могу ли я указать bash в определенных случаях пропускать интерпретацию подстановочных знаков? например с командами, начинающимися с myscript ?

1
задан 18 December 2020 в 20:49

1 ответ

$ cat myscript
for a ;do echo "-$a-"; done
exit 7

$ cat setup
myscript_helper() { set +o noglob; ./myscript "$@"; }
alias myscript='set -o noglob; myscript_helper'

$ source setup

$ myscript *; echo $? *
-*-
7 myscript setup

myscript — ваш внешний скрипт. Здесь он просто выводитсвои аргументы и завершает работу со статусом выхода 7. setup — скрипт для создания вспомогательной функции и псевдонима; он должен быть sourced (с точками), чтобы добавить функцию и псевдоним в вашу текущую оболочку.

Когда вы запускаете myscript, вызывается псевдоним и set -o noglob (то же, что и set -f) запускается до анализа и передачи аргументов. на myscript_helper. Когда функция myscript_helper запускается (в текущей оболочке), она сначала сбрасывает noglob, а затем вызывает скрипт myscript с указанными аргументами и возвращает статус выхода (7 в данном случае).

Этот хак следует использовать только для интерактивного использования. Результаты могут быть очень неожиданными в этом конкретном случае использования, но общий метод можно использовать в самых разных ситуациях. Например, я использую этот метод для вызова (в командной строке) сценария xyz, который должен быть sourced, но псевдоним xyz позаботится о источникскрипт xyz для меня.

0
ответ дан 24 December 2020 в 22:28

Другие вопросы по тегам:

Похожие вопросы: