This was posted before the question was clarified, and now addresses a different need. I'm still leaving it here as that can be useful to others.
Я полагаю, ты хочешь уметь:
x *.txt
и *.txt
должны быть переданы в нераскрытом виде в any.sh
и глобусы, которые впоследствии будут снова включены.
Вы не можете сделать это с bash
. Вместо этого используйте zsh
, где вы можете сделать:
alias x='noglob any.sh`
Где noglob
отключает псевдонимы только для этой команды.
$ echo /etc/p*d
/etc/pam.d /etc/passwd /etc/profile.d
$ noglob echo /etc/p*d
/etc/p*d
Обратите внимание, что это влияет на раскрытие подстановок в аргументах только этих echo
команд. *
по-прежнему будет расширен в noglob echo $(echo *)
или noglob eval 'echo *'
или noglob. some-script
, где some-script
заменяет echo *
.
На самом деле, может быть способ сbash
:
oneshot_noglob() {
case $- in
(*f*) ;; # globs already disabled
(*) set -f; shot=0; debug_trap=$(trap -p DEBUG)
trap '
if ((++shot == 2)); then
set +f
trap - DEBUG
'"$debug_trap"'
fi' DEBUG;;
esac
}
alias x='oneshot_noglob; any.sh'
Который использует ловушку DEBUG для восстановления set +f
после выполнения одной команды после set -f
.
Теперь, со всеми псевдонимами, которые содержат более одной команды, есть несколько предостережений.
echo foo | x
Становится:
echo foo | oneshort_noglob; any.sh
Таким образом, вывод echo
подается только на oneshort_noglob
.
То же самое для таких вещей, как:
cmd && x
Где any.sh
будет выполняться независимо от того, будет ли cmd
успешным или нет.
Также обратите внимание, что это влияет на все универсальные объекты на каждом уровне подоболочки до тех пор, пока непосредственно перед выполнением второй команды в основном процессе оболочки.
Например, в x $(echo *; echo *) *
ни один из этих *
не будет расширен, потому что ловушка DEBUG не наследуется, если вы не установите опцию extdebug
.