Bash: defina una función en bashrc que pueda ser utilizada por cualquier script a nivel mundial

Bash: defina una función en bashrc que pueda ser utilizada por cualquier script a nivel mundial

Me gusta definir una función ~/.bashrcy usarla en diferentes scripts, ya sea a través de export -fo source .bashrc.

La función:

nano ~/.bashrc

function test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

export -f test_func

La secuencia de comandos:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Problema-1:

Después test_func, el resto del comando --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'no funciona en absoluto.



Problema-2:

Anteriormente, cuando intenté usarlo source .bashrcen mi script, recibí estos errores:

/usr/local/scripts/test.sh: line 3: .bashrc: No such file or directory
/usr/local/scripts/test.sh: line 12: test_func: command not found

La función (sin export -f):

nano ~/.bashrc

function test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

El guión (con source .bashrc):

#!/bin/bash

source .bashrc

cd /home/admn/Downloads/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Editar-1:

$ bash -xv /usr/local/scripts/test.sh
#!/bin/bash

source /home/admn/.bashrc
+ source /home/admn/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# alias pip='pip3.7'
alias python='python3'
++ alias python=python3

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
++ case $- in
++ return

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';
+ test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'
/usr/local/scripts/test.sh: line 5: test_func: command not found
$ 

Estos son algunos de los hilos por los que he pasado; y aunque tengo algunas ideas, todavía no pude encontrar una solución para mi caso de uso. Gracias.

https://unix.stackexchange.com/questions/63665/how-to-define-a-bash-function-that-can-be-used-by-diferentes-scripts

https://stackoverflow.com/questions/6218268/how-to-define-a-bash-function-for-use-in-any-script

https://stackoverflow.com/questions/17219174/variables-set-in-bashrc-and-accessing-them-in-shellscript

https://stackoverflow.com/questions/1500499/cómo-llamar-una-función-definida-en-bashrc-from-the-shell

Definir una función bash disponible globalmente para ser utilizada por cualquier script

SO: Ubuntu MATE 21.04

Bash: versión 5.1.4(1) (x86_64-pc-linux-gnu)

Respuesta1

Si desea que la función utilice parámetros, debe mencionarlos explícitamente.

function test_func() {
    yt-dlp "$@" -f '299+140' --merge-output-format mp4 -cia List.txt
    #      ~~~~
}

"$@"significa "todos los parámetros", también puede utilizar parámetros posicionales como "$1", "$2"etc.

Si obtiene un archivo de un directorio diferente, debe especificar una ruta completa o tener la ruta del archivo en formato $PATH.

source ~/.bashrc
# or
PATH+=:~
source .bashrc

Después de la actualización: Contiene .bashrcun returnque deja de procesar .bashrcsi no se ejecuta en un shell interactivo. Coloque la declaración de función en algún lugar antes de la condición si también desea ejecutarla en shells no interactivos.

Respuesta2

Alternativamente, puede "ejecutar" su archivo de script buscándolo. Digamos que ha definido su script personalizado con funciones en ./myScript. Luego, al comienzo de cada secuencia de comandos en la que desee utilizar estas funciones, obtenga este archivo:

# Load my custom functions from file
source ./myScript

Esta es una práctica de programación extremadamente común y hacerlo de esta manera evitará que se agreguen alias y funciones innecesarias a .bashrc(o .bash_aliases).

información relacionada