Detener la expansión de caracteres comodín de la shell?

¿Hay alguna forma de que un progtwig comstackdo de la línea de comandos indique a bash o csh que no desea que se expanda ningún carácter comodín en sus parámetros?

Por ejemplo, uno podría querer un comando de shell como:

foo *

simplemente devolver el valor ASCII numérico de ese carácter.

No. La expansión tiene lugar antes de que el comando se ejecute realmente.
Solo puede desactivar el globo antes de ejecutar el comando o citando la estrella.

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

Si bien es cierto que un comando en sí no puede desactivar el globbing, es posible que un usuario le diga a un shell Unix que no bloquee un comando en particular. Esto generalmente se logra editando los archivos de configuración de un shell. Asumiendo que el comando foo se puede encontrar a lo largo de la ruta del comando, lo siguiente necesitaría ser agregado al archivo de configuración apropiado:

Para las conchas sh, bash y ksh:

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

Para los shells csh y tcsh:

 alias foo 'set noglob;\foo \!*;unset noglob' 

Para el shell zsh:

 alias foo='noglob foo' 

La ruta del comando no tiene que ser utilizada. Digamos que el comando foo está almacenado en el directorio ~ / bin, entonces lo anterior se convertiría en:

Para las conchas sh, bash y ksh:

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

Para los shells csh y tcsh:

 alias foo 'set noglob;$home/bin/foo \!*;unset noglob' 

Para el shell zsh:

 alias foo='noglob ~/bin/foo' 

Todo lo anterior fue probado usando el OSX 10.9.2 de Apple. Nota: Al copiar el código anterior, tenga cuidado con la eliminación de espacios. Pueden ser significativos.

Actualizar:

El usuario geira ha señalado que en el caso de un shell bash

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

podría ser reemplazado con

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

que elimina la necesidad de la función foo.

Algunos sitios web utilizados para crear este documento:

  • Shell de Unix

  • Pasar argumentos de línea de comando a un comando Bash Alias

  • Csh – El C Shell

  • Comandos Bash Builtin

  • Comparación con las secuencias de inicio Bourne shell y csh

  • Alias ​​Loop en csh

  • ¿Cómo pasar argumentos de línea de comando a un alias de shell?

  • Invocar progtwig cuando una función bash tiene el mismo nombre

  • Variables de shell especiales

  • C Shell Alias ​​con argumentos de línea de comandos

  • Evitar la expansión / globbing de comodines en scripts de shell

La expansión la realiza el shell antes de ejecutar su progtwig. Su progtwig no tiene idea de si la expansión ha ocurrido o no.

  set -o noglob 

desactivará la expansión en el intérprete de comandos invocante, pero tendría que hacer eso antes de invocar su progtwig.

La alternativa es citar tus argumentos, por ejemplo

 foo "*" 

Cuidado: si no hay nombres que coincidan con la máscara, bash pasa el argumento tal cual, ¡sin expansión!

Proof (pa.py es un script muy simple, que solo imprime sus argumentos):

  $ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp'] 

No. Un shell Bourne-style siempre realiza globbing cuando es apropiado antes de ejecutar el comando. El usuario tiene que citar o escapar de los argumentos para evitar globbing, como foo \* ; el progtwig real que se está ejecutando no puede indicar una preferencia.