Bash: Defina uma função no bashrc que pode ser usada por qualquer script globalmente

Bash: Defina uma função no bashrc que pode ser usada por qualquer script globalmente

Gosto de definir uma função ~/.bashrce usá-la em diferentes scripts via export -fou source .bashrc.

A função:

nano ~/.bashrc

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

export -f test_func

O roteiro:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

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

Problema-1:

Depois test_func, o resto do comando --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'não está funcionando.



Problema-2:

Anteriormente, quando tentei usar source .bashrcem meu script, estava recebendo estes erros:

/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

A função (sem export -f):

nano ~/.bashrc

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

O script (com 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
$ 

Esses são alguns dos tópicos pelos quais passei; e embora eu tenha algumas ideias, ainda não consegui encontrar uma solução para meu caso de uso. Obrigado.

https://unix.stackexchange.com/questions/63665/how-to-define-a-bash-function-that-can-be-used-by- Different-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/how-do-you-call-a-function-defined-in-bashrc-from-the-shell

Defina uma função bash disponível globalmente para ser usada por qualquer script

SO: Ubuntu MATE 21.04

Bash: versão 5.1.4(1)-release (x86_64-pc-linux-gnu)

Responder1

Se quiser que a função use parâmetros, você precisa mencioná-los explicitamente.

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

"$@"significa "todos os parâmetros", você também pode usar parâmetros posicionais como "$1",, "$2"etc.

Se você originar um arquivo de um diretório diferente, será necessário especificar um caminho completo para ele ou ter o caminho do arquivo no formato $PATH.

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

Após a atualização: Seu .bashrccontém um returnarquivo que interrompe o processamento .bashrcse não estiver em execução em um shell interativo. Coloque a declaração da função em algum lugar antes da condição se quiser executá-la também em shells não interativos.

Responder2

Alternativamente, você pode 'executar' seu arquivo de script obtendo-o. Digamos que você tenha definido seu script personalizado com funções no formato ./myScript. Então, no início de cada script onde você deseja usar essas funções, você obtém este arquivo:

# Load my custom functions from file
source ./myScript

Esta é uma prática de programação extremamente comum, e fazê-lo desta forma evitará que aliases e funções desnecessárias sejam adicionadas a .bashrc(ou .bash_aliases).

informação relacionada