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


14

私は私のために物事を簡素化する関数を作成することを計画しています。関数は次のようになります

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

そのためlazymodeシェルでコマンドを使用すると、Hello World!

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

回答:


13

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

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

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

  • 利用できるものが見やすくなりました
  • 構文エラーはあなたのプロファイルを傷つけません
  • スクリプトを変更する場合、bashの設定を再ソースする必要はありません。
  • ~/bin/絶対パスが使用されているか、そのシェルのパスに含まれている限り、どのシェルでも使用できます(ほとんどの場合、これは不明です)。

後のオプションを使用しました。私の機能には、ファイルを削除するコマンド、wgetのもの、コマンドjavacおよびjavaを実行するコマンドが含まれています。そして、gnome-terminalで試してみたところ、うまくいきません。問題があると思いますか?
アベルメルキエーデスカレホ

代わりに何をしますか?
オリ

すでに修正されています。この回答によって修正されました
アベルメルキエーデスカレホ

うーん... /usr/local/bin代わりにユーザースクリプトを使用するべきではありません$PATHか?
ブライアム

~/.bashrcsourcedのように)関数を配置することの小さいながら価値のある利点は、BashがPATHルックアップを行う前に関数を探すことです。
ザンナ

4

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

あなたはどちらかあなたに直接お使いのシェル関数定義を書くことができ~/.bashrcますが、それらの多くを持っているし、あなたの乱雑にしたくない場合は、ファイル、または~/.bashrcすべてのあなたの選択した別のファイルにそれらを置くことができ、ファイルを-念源になることファイル内の~/.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してその存在をテストし、それをソースとしてエイリアスを確立することに非常に似ています。


おかげで、うまくいきました。ところで、.profileとの違いは何ですか?一部のLinuxで、私はbashrcにに関数を置くことができない
アベルMelquiades Callejo

2
~/.profileファイルは、ログインシェルのコマンドインタープリターによって実行されます。GUIを使用してターミナルを開くと、ログインしていないシェルに移動するため、そのファイルは実行されません。
ラドゥラディアナヌ

1

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

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

  2. 終わりには~/.bashrc、たとえば、独自の関数を宣言します。

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

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

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


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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.