Bash: Definieren Sie eine Funktion in bashrc, die von allen Skripten global verwendet werden kann

Bash: Definieren Sie eine Funktion in bashrc, die von allen Skripten global verwendet werden kann

Ich definiere gerne eine Funktion in ~/.bashrcund verwende sie in verschiedenen Skripten entweder über export -foder source .bashrc.

Die Funktion:

nano ~/.bashrc

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

export -f test_func

Das Skript:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

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

Problem 1:

Danach funktioniert test_funcder Rest des Befehls überhaupt nicht mehr.--autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'



Problem 2:

Als ich vorhin versucht habe, es source .bashrcin meinem Skript zu verwenden, habe ich folgende Fehlermeldungen erhalten:

/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

Die Funktion (ohne export -f):

nano ~/.bashrc

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

Das Skript (mit source .bashrc):

#!/bin/bash

source .bashrc

cd /home/admn/Downloads/YT_DL;

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

Bearbeiten-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
$ 

Dies sind einige der Threads, die ich durchgegangen bin. Und obwohl ich einige Ideen habe, konnte ich immer noch keine Lösung für meinen Anwendungsfall finden. Danke.

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/wie-ruft-man-eine-in-bashrc-definierte-funktion-von-der-shell-auf

Definieren Sie eine global verfügbare Bash-Funktion zur Verwendung durch jedes Skript

Betriebssystem: Ubuntu MATE 21.04

Bash: 5.1.4(1)-Version (x86_64-pc-linux-gnu)

Antwort1

Wenn die Funktion Parameter verwenden soll, müssen Sie diese explizit angeben.

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

"$@"steht für „alle Parameter“, Sie können auch Positionsparameter wie "$1", "$2", usw. verwenden.

Wenn Sie eine Datei aus einem anderen Verzeichnis beziehen, müssen Sie entweder einen vollständigen Pfad dazu angeben oder den Dateipfad in angeben $PATH.

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

Nach dem Update: Ihr Befehl .bashrcenthält eine returnFunktion, die die Verarbeitung stoppt, .bashrcwenn sie nicht in einer interaktiven Shell ausgeführt wird. Platzieren Sie die Funktionsdeklaration irgendwo vor der Bedingung, wenn Sie sie auch in nicht interaktiven Shells ausführen möchten.

Antwort2

Alternativ können Sie Ihre Skriptdatei „ausführen“, indem Sie sie als Quelle verwenden. Angenommen, Sie haben Ihr benutzerdefiniertes Skript mit Funktionen in definiert ./myScript. Dann verwenden Sie am Anfang jedes Skripts, in dem Sie diese Funktionen verwenden möchten, diese Datei als Quelle:

# Load my custom functions from file
source ./myScript

Dies ist eine äußerst gängige Programmierpraxis und durch diese Vorgehensweise wird verhindert, dass unnötige Aliase und Funktionen hinzugefügt werden .bashrc(oder .bash_aliases).

verwandte Informationen