У меня был похожий вопрос, но вместо обнаружения , когда пользователь вызвал скрипт с использованием подстановочного знака, я просто хотел запретить использование подстановочного знака и передать строку предвспенивания.
Решение Тома отлично, если вы хотите обнаружить, но я бы предпочел предотвратить. Другими словами, если бы у меня был скрипт под названием findin, который выглядел бы как
#!/bin/bash
echo "[${1}]"
и запустил его, используя:
$ findin *
Я ожидаю, что результат будет просто
[*]
Чтобы сделать это, вы можете просто найти псевдоним
alias findin='set -f; /path/to/findin'
Но тогда у вас будет установлен параметр оболочки до конца сеанса. Это, вероятно, сломает многие программы, которые этого не ожидают (например, ls -lh * .py). Вы можете проверить это, набрав
echo $-
в консоли. Если вы видите f, эта опция установлена.
Вы можете вручную удалить эту опцию, набрав
set +f
после каждого случая нахождения, но это станет утомительным и раздражающим.
Поскольку сценарии оболочки порождают подоболочки, и вы не можете очистить флаг из сценария (set + f), я пришел к следующему решению:
g(){ /usr/local/bin/findin "$@"; set +f; }
alias findin='set -f; g'
Примечание: «g» может быть не лучшим названием для функции, поэтому рекомендуется изменить его.
Наконец, вы можете обобщить это, выполнив что-то вроде:
reset_expansion(){ CMD="$1"; shift; $CMD "$@"; set +f; }
alias findin='set -f; reset_expansion /usr/local/bin/findin'
Таким образом, для другого сценария, в котором вы хотите отключить расширение, потребуется только дополнительный псевдоним, например,
alias newscript='set -f; reset_expansion /usr/local/bin/newscript'
, а не дополнительная функция оболочки.
Для более длинного, чем необходимо, написания, см. мой пост здесь .