¿Dónde puedo poner una función de shell definida por el usuario?

14

Estoy planeando crear una función que simplifique las cosas para mí. La función sería algo así como

function lazymode()
{
echo "Hello World!";
}

para que cuando use el comando lazymodeen el shell , salga el Hello World!.

¿Qué archivo debo poner la función definida por el usuario?

Abel Melquiades Callejo
fuente

Respuestas:

14

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).
Oli
fuente
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.

Radu Rădeanu
fuente
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:

  1. 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

  2. Al final de ~/.bashrcdeclara tu propia función, por ejemplo:

    find_dirs(){
        find "$1" -type d
    }
  3. 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.

Sergiy Kolodyazhnyy
fuente