Existe alguma maneira de um programa de linha de comando compilado dizer ao bash ou csh que ele não deseja que nenhum caractere curinga seja expandido em seus parâmetros?
Por exemplo, pode-se querer um comando shell como:
foo *
para simplesmente retornar o valor ASCII numérico desse caractere.
pwd
,echo *
é apenas*
nullglob
estiver desabilitada, a palavra não será alterada. Se anullglob
opção for definida e nenhuma correspondência for encontrada, a palavra será removida."set -f
? É issounset -f
?set +f
Embora seja verdade que um comando em si não pode desativar o globbing, é possível para um usuário dizer a um shell Unix para não globalizar um comando específico. Isso geralmente é feito editando os arquivos de configuração de um shell. Assumindo que o comando
foo
pode ser encontrado ao longo do caminho do comando, o seguinte precisa ser adicionado ao arquivo de configuração apropriado:Para os shells sh, bash e ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
Para os shells csh e tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
Para o shell zsh:
alias foo='noglob foo'
O caminho do comando não precisa ser usado. Digamos que o comando foo esteja armazenado no diretório ~ / bin, então o acima se tornaria:
Para os shells sh, bash e ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
Para os shells csh e tcsh:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Para o shell zsh:
alias foo='noglob ~/bin/foo'
Todos os itens acima foram testados usando o OSX 10.9.2 da Apple. Nota: Ao copiar o código acima, tome cuidado ao excluir quaisquer espaços. Eles podem ser significativos.
Atualizar:
O usuário geira apontou que, no caso de um bash shell
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
poderia ser substituído por
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
o que elimina a necessidade da função foo.
Alguns sites usados para criar este documento:
Shell Unix
Passe os argumentos da linha de comando para um comando Bash Alias
Csh - The C Shell
Comandos Bash internos
Comparação com o shell Bourne e as sequências de inicialização csh
Alias Loop em csh
Como passar argumentos de linha de comando para um alias de shell?
Invocar programa quando uma função bash tiver o mesmo nome
Variáveis de shell especiais
Aliases de shell C com argumentos de linha de comando
Prevenção de expansão / globbing de curinga em scripts Shell
fonte
A expansão é executada pelo shell antes de seu programa ser executado. Seu programa não tem ideia se a expansão ocorreu ou não.
set -o noglob
irá desligar a expansão no shell de invocação, mas você terá que fazer isso antes de invocar seu programa.
A alternativa é citar seus argumentos, por exemplo
foo "*"
fonte
set -o noglob
para desabilitar a expansão de curinga.Cuidado: se não houver nomes correspondentes à máscara, o bash passa o argumento como está, sem expansão!
Prova (pa.py é um script muito simples, que apenas imprime seus argumentos):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
fonte
set -o nullglob
oushopt -s failglob
, e esse comportamento mudará (de duas maneiras muito diferentes).