Я хотел бы иметь возможность записать *
в свой сценарий, и чтобы получить *
как есть (т.е. без расширения).
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
?
$ 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
— скрипт для создания вспомогательной функции и псевдонима; он должен быть source
d (с точками), чтобы добавить функцию и псевдоним в вашу текущую оболочку.
Когда вы запускаете myscript
, вызывается псевдоним и set -o noglob
(то же, что и set -f
) запускается до анализа и передачи аргументов. на myscript_helper
. Когда функция myscript_helper
запускается (в текущей оболочке), она сначала сбрасывает noglob
, а затем вызывает скрипт myscript
с указанными аргументами и возвращает статус выхода (7
в данном случае).
Этот хак следует использовать только для интерактивного использования. Результаты могут быть очень неожиданными в этом конкретном случае использования, но общий метод можно использовать в самых разных ситуациях. Например, я использую этот метод для вызова (в командной строке) сценария xyz
, который должен быть source
d, но псевдоним xyz
позаботится о источник
скрипт xyz
для меня.