¿Es posible definir una función macro en bash así que cuando escribo:definir una macro-función como en bash
F(sth);
fiesta dirige este:
echo "sth" > a.txt;
¿Es posible definir una función macro en bash así que cuando escribo:definir una macro-función como en bash
F(sth);
fiesta dirige este:
echo "sth" > a.txt;
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.
F() {
echo "$1" > a.txt
}
Usted don No use paréntesis cuando lo llame. Así es como se llama:
F "text to save"
+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
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
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