スクリプトを呼び出す Bash エイリアスとスクリプトを関数として定義する

スクリプトを呼び出す Bash エイリアスとスクリプトを関数として定義する

.bash_aliases ファイルには 150 以上のショートカットが定義されています。その中には次のような単純なコマンドもあります。

# Opens file with default program
o () { xdg-open "$@" & disown; }

# Folder shortcuts
alias ..='cd .. && ls'

他の人は、マシン上の別の場所にある次のようなスクリプトを呼び出しています。

alias i3exit='~/.config/i3/i3exit.sh'

その他には、o上記のコマンドのように定義される、30 ~ 80 行のみの大きなスクリプトもあります。

bash 関数として直接定義されたスクリプトと、別のファイルからスクリプトを呼び出すエイリアスの違いは何ですか? どちらか一方が他方よりも好ましいですか? 好ましい場合、その理由は何ですか?

直感的には、スクリプト ファイルを別々に用意する方がよいと思われますが、それについては特に議論の余地はありません。

答え1

これらをファイルで定義した場合~/.bash_aliases、これはUbuntu固有のものであり、~/.bashrcUbuntuのデフォルトインストールで読み込まれますが、はい、ファイルは新しい対話型の非ログインシェルを起動するたびに読み込まれるため、オーバーヘッドが発生します。たとえば、新しいターミナルウィンドウを開くたびに読み込まれるためです。最新のマシンでは、このオーバーヘッドはほとんど検出されませんが、古いマシン、組み込みシステム、または負荷複雑な関数が定義されています。

さらに、このように定義された関数とエイリアスは、デフォルトではスクリプトからアクセスできません。したがって、スクリプトでこれらの関数のいずれかを使用する場合は、明示的に source .bashrc(または.bash_aliases) を実行する必要があります。 に外部スクリプト ファイルとしてこれらがある場合$PATH、その必要はありません。

私の個人的な経験則は、関係するコマンドの複雑さと、私が書いている関数/スクリプトが非対話型シェル (他のスクリプトなど) に役立つかどうかにかかっています。数十行のコードを書くことになった場合は、おそらくスクリプトに移動します。多くの異なるコンテキストで使用でき、別のスクリプトを書くときに役立つ可能性があるものを書いている場合は、やはりスクリプトに移動します。

ただし、質問に示されているような、対話的に実行するときにのみ本当に役立つ単純な小さな関数だけが必要な場合は、関数を使用します。したがって、これは実際には個人の好みの問題であり、定義する関数をどのように、いつ使用するかを考慮する必要があります。

関連情報