Ich definiere gerne eine Funktion in ~/.bashrc
und verwende sie in verschiedenen Skripten entweder über export -f
oder 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_func
der 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 .bashrc
in 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://stackoverflow.com/questions/6218268/how-to-define-a-bash-function-for-use-in-any-script
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 .bashrc
enthält eine return
Funktion, die die Verarbeitung stoppt, .bashrc
wenn 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
).