Me gusta definir una función ~/.bashrc
y usarla en diferentes scripts, ya sea a través de export -f
o 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 .bashrc
en 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://stackoverflow.com/questions/6218268/how-to-define-a-bash-function-for-use-in-any-script
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 .bashrc
un return
que deja de procesar .bashrc
si 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
).