web-dev-qa-db-ja.com

ユーザー定義のシェル関数はどこに置けますか?

私は物事を簡単にする機能を作成する予定です。関数は次のようになります

function lazymode()
{
echo "Hello World!";
}

Shelllazymodeコマンドを使用すると、Hello World!が出力されます。

ユーザー定義関数をどのファイルに配置する必要がありますか?

機能に依存します。それがそのような非常に単純なワンライナーである場合、エイリアスを作成するか、~/.bashrc(bashが起動時にロードするファイル)に関数を貼り付けることができます。

もう少し肉付きの良いものを作成する場合は、~/bin/に独自の実行可能スクリプトを作成する方が理にかなっているかもしれません。このため、ファイルは実行可能(chmod +x filename)であり、適切な#!/bin/bashスタンザで開始する必要があることに注意してください。

2番目のルートには、いくつかの明確な利点があります。

  • 利用可能なものを確認するのは簡単です
  • 構文エラーはあなたのプロファイルを傷つけません
  • スクリプトを変更する場合、bash configを再ソースし続ける必要はありません。
  • 完全なパスが使用されているか、~/bin/がそのシェルのパスにある限り(ほとんどの場合、これは既知のはずです)、すべてのシェルで使用できます。
12
Oli

最良の選択は~/.bashrcファイルです。

シェル関数の定義を~/.bashrcファイルに直接書き込むか、~/.bashrcファイルがたくさんあり、乱雑にしたくない場合は、すべてを別のファイルに入れることができますあなたの選択-必ずソースを確認してくださいthat~/.bashrcファイルのファイル。たとえば、関数を含むファイルの名前がbash_functionsの場合、単に~/.bashrcファイルに次の行を追加します。

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

または、同等に:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

ここで、.sourceの単なるシンボリック表現です。 ifテストは、ソースとなる前にファイル/path/to/bash_functionsが存在することを確認します。

この手法は、~/.bashrcという名前のファイルを作成し、上記の~/.bash_aliasesの構文と同様の構文を使用して、その存在をテストしてからソースを取得することにより、~/.bashrcでエイリアスを確立することに非常に似ています。

4
Radu Rădeanu

永続的な関数を宣言するための重要な手順は次のとおりです。

  1. テキストエディタで~/.bashrcファイルを開きます。使用方法を知っていて、/home/<username>/.bashrcを開いている限り、どのテキストエディターでもかまいません

  2. ~/.bashrcの最後で、たとえば次のように独自の関数を宣言します。

    find_dirs(){
        find "$1" -type d
    }
    
  3. ファイルを保存して閉じます。

~/.bashrcファイルは、インタラクティブシェルを開くたびに読み込まれます(つまり、新しいターミナルタブ、ssh経由でログイン、またはTTY1または他の仮想コンソールを開きます)。 ~/.bashrcは非対話型シェルでは読み取られないため、これはスクリプトファイルでは使用できません。 --norcオプションを指定してbashを実行した場合も使用できません。

現在開いているタブで関数をすぐに使用可能にするには、source ~/.bashrcコマンドを使用します。


関数は、通常のコマンドと同様に引数を取ります。たとえば、$1$9は、関数を呼び出すときの位置パラメーターを示します。上記の例では、find_dirsは1つの定位置パラメーターのみを取り、find_dirs /etcとして呼び出されます。 $@を使用して、すべての定位置パラメーターを参照することもできます。関数はリダイレクトも受け入れます。 find_dirs $1 > /dev/nullを使用して関数を呼び出すことができます。次のように宣言することもできます。

find_dirs(){
    find "$1" -type d
}

man bashからの注意:「関数は現在のシェルのコンテキストで実行されます。それらを解釈するための新しいプロセスは作成されません」。つまり、シェル実行環境を変更する機能を備えた関数(変数とターミナル設定の変更)にも注意する必要があります。

1