web-dev-qa-db-ja.com

シェルから.bashrcで定義された関数をどのように呼び出すのですか?

.bashrcには、helloという関数があります。

function hello() {
   echo "Hello, $1!"
}

次のように、シェルからhello()を呼び出すことができます。

$ hello Lloyd

出力を取得します。

> Hello, Lloyd!

トリックは何ですか?

(もちろん、私が念頭に置いている実際の機能はもっと複雑です。)

編集:これは本当に関数の構文エラーが原因だと思います! :(

function coolness() {

    if[ [-z "$1"] -o [-z "$2"] ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}
52
les2

関数内のテストは機能しません。-z句を角かっこで囲むことはできません。また、ifと開き角かっこの間にスペースが必要です。次のようになります。

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
    echo "Hi!"
}
27
Cascabel

関数をエクスポートできます。あなたの~/.bashrc関数を定義した後、export -f functionname

function hello() {
   echo "Hello, $1!"
}

export -f hello

その後、シェルプロンプトで、またそこから呼び出す他のスクリプトで関数を使用できます。

子プロセスで使用する場合を除き、関数をエクスポートする必要はないことに注意してください(前の文の「また」)。通常、それでも、関数を使用するファイルにsourceする方が良いでしょう。

編集

Bash条件ステートメントの角かっこは角かっこではなく、コマンドです。周囲にスペースが必要です。条件をグループ化する場合は、括弧を使用します。機能は次のとおりです。

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

その条件を記述するより良い方法は次のとおりです。

    if [[ -z "$1" || -z "$2" ]]; then

二重括弧は、単一の括弧よりも多くの機能を提供するためです。

71

スクリプトに次の行を含めます

source .bashrc

sourceコンストラクトで試してください。

17
Lopoc

.bashrcに加えられた変更は、新しいターミナルセッションでのみ有効になります。現在のターミナルセッションに変更を適用する場合は、.bashrcを再読み取りするようシェルに指示する必要があります。これへの最短の方法は.コマンドを使用することです。これはsourceの同義語です:

[user@linuxPc]$ . ~/.bashrc
11
mihai
$ source .bashrc
4
PiedPiper