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/bashrc で変数を設定し、shellscript でそれらにアクセスする

https://stackoverflow.com/questions/1500499/how-do-you-call-a-function-defined-in-bashrc-from-the-shell

あらゆるスクリプトで使用できるグローバルに利用可能なbash関数を定義する

OS: 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

アップデート後: には、対話型シェルで実行されていない場合に処理を停止する が.bashrc含まれています。非対話型シェルでも実行したい場合は、条件の前のどこかに関数宣言を配置してください。return.bashrc

答え2

あるいは、スクリプト ファイルをソースとして実行することもできます。 の関数を使用してカスタム スクリプトを定義したとします./myScript。次に、これらの関数を使用する各スクリプトの先頭で、このファイルをソースとして指定します。

# Load my custom functions from file
source ./myScript

これは非常に一般的なプログラミング手法であり、この方法を実行すると、不要なエイリアスや関数が.bashrc(または.bash_aliases) に追加されるのを防ぐことができます。

関連情報