Depende de la función. Si solo se trata de un trazo súper simple como ese, podría crear un alias o pegar la función en ~/.bashrc(un archivo que bash se carga cuando se inicia).
Si está creando algo un poco más carnoso, podría tener más sentido crear su propio script ejecutable en el ~/bin/que no existirá de manera predeterminada (es solo un directorio) pero debería estar en su camino. Recuerde para esto que el archivo deberá ser ejecutable ( chmod +x filename) y comenzar con una #!/bin/bashestrofa adecuada .
La segunda ruta tiene algunos beneficios claros:
Es más fácil ver qué hay disponible.
Un error de sintaxis no afectará su perfil
No necesita volver a obtener su configuración de bash si cambia el script
Está disponible para cualquier shell siempre que se use la ruta completa o también ~/bin/esté en la ruta de ese shell (que debería ser AFAIK en la mayoría de los casos).
Usé la opción posterior. Mi función contiene comandos que eliminan archivos, wget es algo, ejecuta los comandos javac y java. y cuando lo probé en el terminal gnome, no funciona bien. ¿Crees que hay un problema?
Abel Melquiades Callejo
¿Qué hace en su lugar?
Oli
Ya está arreglado. Solucionado a través de esta respuesta
Abel Melquiades Callejo
umm ... ¿no deberían estar los scripts de usuario en /usr/local/binlugar de jugar con el $PATH?
Braiam
Me parece que una ventaja pequeña pero digna de mencionar de poner funciones en ~/.bashrc(como es sourced) es que Bash busca funciones antes de realizar la búsqueda de RUTA.
Zanna
4
La mejor opción sería el ~/.bashrcarchivo.
O bien puede escribir sus definiciones de funciones de shell directamente en su ~/.bashrcarchivo, o, si usted tiene un montón de ellos y no quiere saturar su ~/.bashrcarchivo, puede poner a todos en otro archivo de su elección - sólo asegúrese de origen que archivo en su ~/.bashrcarchivo. Por ejemplo, si se nombra el archivo con sus funciones bash_functions, simplemente agregue en su ~/.bashrcarchivo las líneas:
if[[-f /path/to/bash_functions ]];then
source /path/to/bash_functions
fi
o equivalente:
if[[-f /path/to/bash_functions ]];then./path/to/bash_functions
fi
donde el .es solo una representación simbólica de source. La ifprueba asegura que el archivo /path/to/bash_functionsexiste antes de intentar obtenerlo.
Esta técnica es muy similar a establecer alias ~/.bashrccreando un archivo llamado ~/.bash_aliasesy usando una sintaxis similar a la anterior ~/.bashrcpara probar su existencia y luego obtenerla.
Gracias, funcionó. por cierto, ¿cuál es su diferencia con .profile? en algunos Linux, no puedo poner funciones en bashrc
Abel Melquiades Callejo
2
~/.profileEl intérprete de comandos ejecuta el archivo para shells de inicio de sesión. Cuando usa la GUI y abre la terminal, ese archivo no se ejecuta porque estará en un shell de inicio de sesión no.
Radu Rădeanu
1
Aquí hay un procedimiento esencial para declarar una función permanente:
Abrir ~/.bashrcarchivo en un editor de texto. No importa qué editor de texto, siempre que sepa cómo usarlo y siempre que abra el/home/<username>/.bashrc
Al final de ~/.bashrcdeclara tu propia función, por ejemplo:
find_dirs(){
find "$1"-type d
}
Guarde y cierre el archivo.
El ~/.bashrcarchivo se lee cada vez que abre un shell interactivo (es decir, una nueva pestaña de terminal, inicia sesión a través de ssho abre TTY1 u otra consola virtual). Esto no estará disponible en los archivos de script, porque ~/.bashrcno se lee para shells no interactivos. Tampoco está disponible si ejecuta bashcon --norcopción.
Si desea que la función esté disponible inmediatamente en la pestaña abierta actualmente, use el source ~/.bashrccomando.
Las funciones toman argumentos como los comandos regulares. Por ejemplo, a $1través de $9indicar los parámetros posicionales cuando llama a una función. En el ejemplo anterior find_dirs, solo toma un parámetro posicional y se llamaría como find_dirs /etc. También puede usar $@para referirse a todos los parámetros posicionales. Las funciones también aceptan la redirección. Puedes llamar a una función con find_dirs $1 > /dev/null; También podríamos declararlo de la siguiente manera:
find_dirs(){
find "$1"-type d
}
Nota de man bash: "Las funciones se ejecutan en el contexto del shell actual; no se crea ningún proceso nuevo para interpretarlas". Eso significa que también debe tener en cuenta las funciones que tienen la capacidad de alterar su entorno de ejecución de shell: cambiar las variables y la configuración del terminal.
/usr/local/bin
lugar de jugar con el$PATH
?~/.bashrc
(como essource
d) es que Bash busca funciones antes de realizar la búsqueda de RUTA.La mejor opción sería el
~/.bashrc
archivo.O bien puede escribir sus definiciones de funciones de shell directamente en su
~/.bashrc
archivo, o, si usted tiene un montón de ellos y no quiere saturar su~/.bashrc
archivo, puede poner a todos en otro archivo de su elección - sólo asegúrese de origen que archivo en su~/.bashrc
archivo. Por ejemplo, si se nombra el archivo con sus funcionesbash_functions
, simplemente agregue en su~/.bashrc
archivo las líneas:o equivalente:
donde el
.
es solo una representación simbólica desource
. Laif
prueba asegura que el archivo/path/to/bash_functions
existe antes de intentar obtenerlo.Esta técnica es muy similar a establecer alias
~/.bashrc
creando un archivo llamado~/.bash_aliases
y usando una sintaxis similar a la anterior~/.bashrc
para probar su existencia y luego obtenerla.fuente
~/.profile
El intérprete de comandos ejecuta el archivo para shells de inicio de sesión. Cuando usa la GUI y abre la terminal, ese archivo no se ejecuta porque estará en un shell de inicio de sesión no.Aquí hay un procedimiento esencial para declarar una función permanente:
Abrir
~/.bashrc
archivo en un editor de texto. No importa qué editor de texto, siempre que sepa cómo usarlo y siempre que abra el/home/<username>/.bashrc
Al final de
~/.bashrc
declara tu propia función, por ejemplo:Guarde y cierre el archivo.
El
~/.bashrc
archivo se lee cada vez que abre un shell interactivo (es decir, una nueva pestaña de terminal, inicia sesión a través dessh
o abre TTY1 u otra consola virtual). Esto no estará disponible en los archivos de script, porque~/.bashrc
no se lee para shells no interactivos. Tampoco está disponible si ejecutabash
con--norc
opción.Si desea que la función esté disponible inmediatamente en la pestaña abierta actualmente, use el
source ~/.bashrc
comando.Las funciones toman argumentos como los comandos regulares. Por ejemplo, a
$1
través de$9
indicar los parámetros posicionales cuando llama a una función. En el ejemplo anteriorfind_dirs
, solo toma un parámetro posicional y se llamaría comofind_dirs /etc
. También puede usar$@
para referirse a todos los parámetros posicionales. Las funciones también aceptan la redirección. Puedes llamar a una función confind_dirs $1 > /dev/null
; También podríamos declararlo de la siguiente manera:Nota de
man bash
: "Las funciones se ejecutan en el contexto del shell actual; no se crea ningún proceso nuevo para interpretarlas". Eso significa que también debe tener en cuenta las funciones que tienen la capacidad de alterar su entorno de ejecución de shell: cambiar las variables y la configuración del terminal.fuente