Puncte:0

Bash: Definiți o funcție în bashrc care poate fi utilizată de orice script la nivel global

drapel kp

Îmi place să definesc o funcție în ~/.bashrc și folosiți-l în diferite scripturi fie prin intermediul export -f sau sursa .bashrc.

Functia:

nano ~/.bashrc

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

export -f test_func

Scenariul:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

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

Problema-1:

După test_func, restul comenzii --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s' nu functioneaza deloc.



Problema-2:

Mai devreme când am încercat să folosesc sursa .bashrc în scriptul meu, primeam aceste erori:

/usr/local/scripts/test.sh: linia 3: .bashrc: Nu există un astfel de fișier sau director
/usr/local/scripts/test.sh: linia 12: test_func: comanda nu a fost găsită

Funcția (fără export -f):

nano ~/.bashrc

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

Scenariul (cu sursa .bashrc):

#!/bin/bash

sursa .bashrc

cd /home/admn/Downloads/YT_DL;

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

Editare-1:

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

sursa /home/admn/.bashrc
+ sursa /home/admn/.bashrc
# ~/.bashrc: executat de bash(1) pentru shell-uri non-login.
# vezi /usr/share/doc/bash/examples/startup-files (în pachetul bash-doc)
# de exemplu

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

# Dacă nu rulați interactiv, nu faceți nimic
caz $- in
    *i*) ;;
      *) întoarcere;;
esac
++ caz $- in
++ întoarcere

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: linia 5: test_func: comanda nu a fost găsită
$ 

Acestea sunt câteva dintre firele prin care am trecut; și, deși am câteva idei, tot nu am putut găsi o soluție pentru cazul meu de utilizare. Mulțumiri.

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

Definiți o funcție bash disponibilă la nivel global pentru a fi utilizată de orice script

OS: Ubuntu MATE 21.04

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

Puncte:3
drapel tm

Dacă doriți ca funcția să folosească parametrii, trebuie să îi menționați în mod explicit.

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

"$@" reprezintă „toți parametrii”, puteți utiliza și parametri de poziție precum "$1", "$2", etc.

Dacă sursați un fișier dintr-un director diferit, trebuie fie să specificați o cale completă către acesta, fie să aveți calea fișierului în $PATH.

sursa ~/.bashrc
# sau
CALEA+=:~
sursa .bashrc

După actualizare: Ta .bashrc conţine a întoarcere care oprește procesarea .bashrc dacă nu rulează într-un shell interactiv. Puneți declarația funcției undeva înaintea condiției dacă doriți să o executați și în shell-uri non-interactive.

drapel tm
Încercați să rulați scripturile sub `set -xv`, astfel încât să vedeți ce comenzi sunt executate.
drapel tm
`Return` iese din `.bashrc` înainte de a ajunge la declarația funcției.
drapel tm
`.bashrc` dvs. conține `return` care oprește procesarea `.bashrc` dacă nu rulează într-un shell interactiv. Puneți declarația funcției undeva înaintea condiției dacă doriți să o executați și în shell-uri non-interactive.
Jags avatar
drapel kp
funcția de postare înainte ca starea „return” să o rezolve. Deci, face această parte `# Dacă nu rulează interactiv, nu face nimic | cazul $- în | *i*) ;; | *) întoarcere;; | esac` trebuie să meargă la sfârșitul fișierului `.bashrc`? Mulțumesc mult.
Jags avatar
drapel kp
În cele din urmă, există o modalitate „preferată/standard/mai bună” de a apela funcția din `.bashrc`? Adică, `export -f` vs `source ~/.bashrc` Mulțumesc
drapel tm
Partea „întoarcere” ar trebui să fie înaintea lucrurilor pe care le doriți într-un shell interactiv, dar nu doriți într-unul non-interactiv.
drapel tm
Nu sunt expert, dar prefer `sursă` decât `export`.
Jags avatar
drapel kp
Asta e ceea ce am citit și în câteva locuri că „sursa” este un mod preferat/mai bun. Mulțumesc mult :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.