Bash:在bashrc中定義一個可以被全域任何腳本使用的函數

Bash:在bashrc中定義一個可以被全域任何腳本使用的函數

我喜歡透過或定義函數~/.bashrc並在不同的腳本中使用它。export -fsource .bashrc

功能:

nano ~/.bashrc

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

export -f test_func

劇本:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

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

問題1:

之後test_func,命令的其餘部分--autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'根本不起作用。



問題2:

source .bashrc早些時候,當我嘗試在腳本中使用時,我收到以下錯誤:

/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

函數(不含export -f):

nano ~/.bashrc

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

腳本(帶有source .bashrc):

#!/bin/bash

source .bashrc

cd /home/admn/Downloads/YT_DL;

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

編輯-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
$ 

這些是我經歷過的一些線索;儘管我有一些想法,但我仍然無法為我的用例找到解決方案。謝謝。

https://unix.stackexchange.com/questions/63665/how-to-define-a-bash-function-that-c​​an-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

定義一個全域可用的 bash 函數以供任何腳本使用

作業系統:Ubuntu MATE 21.04

Bash:5.1.4(1)-發布 (x86_64-pc-linux-gnu)

答案1

如果您希望函數使用參數,則需要明確提及它們。

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

"$@"代表“所有參數”,您也可以使用位置參數,例如"$1""$2"等。

如果您從不同的目錄獲取文件,則需要指定它的完整路徑,或者將文件的路徑放在$PATH.

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

更新後:如果不在互動式 shell 中運行,則 包含停止處理的.bashrc。如果您也想在非互動式 shell 中執行函數,請將函數宣告放在條件之前。return.bashrc

答案2

或者,您可以透過取得腳本檔案來「運行」它。假設您已經使用 中的函數定義了自訂腳本./myScript。然後,在要使用這些函數的每個腳本的開頭,請取得以下文件:

# Load my custom functions from file
source ./myScript

這是極其常見的程式設計實踐,這樣做可以防止將不需要的別名和函數添加到.bashrc(或.bash_aliases)。

相關內容