While it is true a command itself can not turn off globbing, it is possible for a user to tell a Unix shell not to glob a particular command. This is usually accomplished by editing a shell's configuration files. Assuming the command foo
can be found along the command path, the following would need to be added to the appropriate configuration file:
For the sh, bash and ksh shells:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
For the csh and tcsh shells:
alias foo 'set noglob;\foo \!*;unset noglob'
For the zsh shell:
alias foo='noglob foo'
The command path does not have to be used. Say the command foo is stored in the directory ~/bin, then the above would become:
For the sh, bash and ksh shells:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
For the csh and tcsh shells:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
For the zsh shell:
alias foo='noglob ~/bin/foo'
All of the above was tested using Apple's OSX 10.9.2.
Note: When copying the above code, be careful about deleting any spaces. They may be significant.
Update:
User geira has pointed out that in the case of a bash shell
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
could be replaced with
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'
which eliminates the need for the function foo.
Some web sites used to create this document: