¿Hay alguna forma de que un programa de línea de comandos compilado le diga a bash o csh que no quiere que se expandan los caracteres comodín en sus parámetros?
Por ejemplo, uno podría querer un comando de shell como:
foo *
para simplemente devolver el valor ASCII numérico de ese carácter.
pwd
,echo *
es solo*
nullglob
está desactivada, la palabra se deja sin cambios. Si lanullglob
opción está configurada y no se encuentran coincidencias, la palabra se elimina".set -f
? ¿Esunset -f
?set +f
Si bien es cierto que un comando por sí mismo no puede desactivar el globbing, es posible que un usuario le diga a un shell de Unix que no use un comando glob en particular. Esto generalmente se logra editando los archivos de configuración de un shell. Suponiendo que el comando
foo
se puede encontrar a lo largo de la ruta del comando, sería necesario agregar lo siguiente 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'
No es necesario utilizar la ruta del comando. 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 se probó con OSX 10.9.2 de Apple. Nota: Al copiar el código anterior, tenga cuidado de eliminar cualquier espacio. Pueden ser importantes.
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'
lo que elimina la necesidad de la función foo.
Algunos sitios web utilizados para crear este documento:
Shell de Unix
Pasar argumentos de la línea de comandos a un comando Bash Alias
Csh: el shell C
Comandos integrados de Bash
Comparación con las secuencias de inicio Bourne shell y csh
Bucle de alias en csh
¿Cómo pasar argumentos de línea de comando a un alias de shell?
Invocar programa cuando una función bash tiene el mismo nombre
Variables de shell especiales
Alias de shell de C con argumentos de línea de comandos
Prevención de la expansión / globbing de comodines en scripts de shell
fuente
La expansión la realiza el shell antes de ejecutar el programa. Su programa no tiene ni idea de si se ha producido una expansión o no.
set -o noglob
desactivará la expansión en el shell de invocación, pero tendrá que hacerlo antes de invocar su programa.
La alternativa es citar sus argumentos, por ejemplo
foo "*"
fuente
set -o noglob
para deshabilitar la expansión de comodines.Cuidado: si no hay nombres que coincidan con la máscara, bash pasa el argumento tal cual, sin expansión.
Prueba (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']
fuente
set -o nullglob
oshopt -s failglob
, y este comportamiento cambiará (de dos formas muy diferentes).