2012-04-17 20 views

Respuesta

14

La sintaxis arbitraria no se puede hacer para hacer nada. Los paréntesis son metacaracteres que tienen un significado especial para el analizador, por lo que no hay forma de que pueda usarlos como nombres válidos. La mejor forma de extender el shell es definir funciones.

Esto sería un echo envoltura básica que siempre escribe en el mismo archivo:

f() { 
    echo "[email protected]" 
} >a.txt 

Esto hace de la misma, pero se encarga, además, de stdin - sacrificar echo's-e y -n opciones:

f() { 
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}" 
} >a.txt 

Que se puede llamar como

f arg1 arg2... 

o

f <file 

Funciones se pasan argumentos en la misma forma que cualquier otro comando.

El segundo envoltorio similar al eco primero prueba ya sea un set first argument, o un stdin que no sea tty, y llama condicionalmente a printf utilizando los parámetros posicionales si se establece, o stdin. La expresión de prueba evita el caso de ambos argumentos cero y ninguna redirección de un archivo, en cuyo caso Bash intentaría expandir la salida del terminal, colgando el shell.

+0

+1, buena respuesta. ¿Te importaría explicar más detalladamente por qué usas esa construcción más compleja (pero mejor) para generar los argumentos? – Kaii

+0

Solo permite la entrada desde stdin o argumentos. La expresión de prueba evita una situación en la que hay dos args cero y stdin viene de un terminal, en cuyo caso el shell debería ser eliminado dado que los procesos propios de tty se están leyendo y bloqueando. Si eso pasa, los parámetros posicionales se expandirán si se establece, o la expansión se leerá desde la entrada de la función. Una solución un poco más portátil pero más lenta es posible con 'cat'; esto requiere un sistema con/dev/fd/* real. Acabo de publicar este truco ya que mi respuesta anterior fue la misma que las demás. :) – ormaaj

+0

también, permite * argumentos múltiples * al igual que 'echo'. Tu función funciona con 'f uno dos dos tres, mientras que los demás solo funcionan con' f 'uno dos tres ''. Con la entrada sin las qotes, las otras soluciones solo tomarían en cuenta la primera palabra (aquí: "uno"). – Kaii

4
F() { 
    echo "$1" > a.txt 
} 

Usted don No use paréntesis cuando lo llame. Así es como se llama:

F "text to save" 
3

Sí, sólo le debe llamar con F sth:

F() 
{ 
    echo "$1" > a.txt 
} 

Leer más here.

Cuestiones relacionadas