Parar a expansão do caractere curinga do shell?

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 em seus parâmetros seja expandido?

Por exemplo, pode-se querer um comando shell como:

foo *

para simplesmente retornar o valor ASCII numérico desse caractere.

Não. A expansão ocorre antes que o comando seja realmente executado.
Você só pode desativar o glob antes de executar o comando ou citando a estrela.

$ # quote it $ foo '*' $ # or escape it $ foo \* $ # or disable the glob (noglob) $ set -f $ foo * 

Embora seja verdade que um comando em si não pode desativar globbing, é possível que um usuário diga a um shell Unix para não globar um comando em particular. Isso geralmente é feito editando os arquivos de configuração de um shell. Supondo que o comando foo possa ser encontrado ao longo do caminho do comando, o seguinte deve ser adicionado ao arquivo de configuração apropriado:

Para as sh sh, bash e ksh shells:

 alias foo='set -f;foo';foo(){ command foo "$@";set +f;} 

Para as conchas 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 as sh sh, bash e ksh shells:

 alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;} 

Para as conchas 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, tenha cuidado ao excluir espaços. Eles podem ser significativos.

Atualizar:

Usuário geira apontou que, no caso de uma concha bash

 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 function foo.

Alguns sites usados ​​para criar este documento:

  • Shell Unix

  • Passar argumentos de linha de comando para um comando Bash Alias

  • Csh – The C Shell

  • Comandos Bash Builtin

  • Comparação com as sequências de boot do shell Bourne e do csh

  • Alias ​​Loop no csh

  • Como passar argumentos de linha de comando para um alias de shell?

  • Chamando o programa quando uma function bash tem o mesmo nome

  • Variáveis ​​especiais do shell

  • C Aliases de shell com argumentos de linha de comando

  • Impedindo expansão / globalização de curingas em scripts de shell

A expansão é executada pelo shell antes do seu programa ser executado. Seu programa não tem idéia se a expansão ocorreu ou não.

  set -o noglob 

irá desativar a expansão no shell de chamada, mas você terá que fazer isso antes de chamar seu programa.

A alternativa é citar seus argumentos, por exemplo

 foo "*" 

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'] 

Não. Um shell estilo Bourne sempre executa globbing quando apropriado antes de executar o comando. O usuário tem que citar ou escaping dos argumentos para evitar globbing, como foo \* ; o programa real sendo executado não pode indicar uma preferência.