Bashでいつエイリアスを使用し、いつスクリプトを使用し、いつ関数を作成しますか?

Bashでいつエイリアスを使用し、いつスクリプトを使用し、いつ関数を作成しますか?

私のようにこの質問をするのに10年かかる人はいません。 Linuxを起動したら、次のことを知りたいです。いつエイリアスを使用し、いつスクリプトを使用し、いつ関数を作成しますか?

エイリアスについては、パラメータを使用しない非常に簡単な操作にエイリアスを使用します。

alias houston='cd /home/username/.scripts/'

これは明らかなようです。しかし、一部の人々はそうします。

alias command="bash bashscriptname"

.bashrc(そしてファイルに追加します)。

これには妥当な理由はありますか?私はこのような状況に遭遇しませんでした。影響を及ぼす可能性がある極端な場合がある場合は、以下に回答してください。

ここがPATHにいくつかの項目を追加したところでchmod +x、Linuxで長年の試行錯誤の末に出てきたもう一つの項目です。

その後、次のトピックに進みます。たとえば、.scripts/()に行を追加してホームディレクトリの隠しフォルダ()をPATHに追加すると、その中のすべての実行可能ファイルが自動的に完成します。.bashrcPATH=$PATH:/home/username/.scripts/

私にはあまり必要ありませんね?私はPythonのようなシェル以外の言語にのみこれを使用します。シェルなら、その中に関数を書くことができます.bashrc

funcname () {
  somecommand -someARGS "$@"
}

私は何を逃したことがありませんか?
エイリアスを使用する必要がある場合、スクリプトを作成する場合、関数を作成する場合についてLinux初心者に何を伝えますか?

不明な場合は、この質問に答える人は3つのオプションをすべて活用すると仮定します。 3つ(エイリアス、スクリプト、関数)のうち1つのみを使用している場合、この質問は実際には適していません。

答え1

他の答えは、個人的な好みに応じていくつかの滑らかな一般的なガイドラインを提供しますが、関連項目のほとんどを無視します。事実スクリプト、関数、または別名を決定するときは、この点を考慮する必要があります。

エイリアスと機能¹

  • エイリアスと関数の内容全体がシェルのメモリに保存されます。
  • これに対する自然な結果は、エイリアスと関数ですただ現在、シェルで使用されており、シェルから呼び出すことができる他のプログラム(テキストエディタ、スクリプト、または同じシェルのサブインスタンス)では使用されていません。
  • エイリアスと関数は現在のシェルで実行されます。つまり、シェルの現在の環境で実行され、影響を与えます。 ² エイリアスや機能を実行するために個別のプロセスは必要ありません。

スクリプト

  • シェルはスクリプトをメモリに保持しません。代わりに、必要に応じて保存されたファイルからスクリプトを読みます。検索でスクリプトを見つけると、多くの$PATHシェルは将来のルックアップ時間を節約するためにそのパス名のハッシュをメモリに保存しますが、これを$PATH使用しない場合はスクリプトのメモリ領域の範囲です。
  • 関数やエイリアスよりもスクリプトを呼び出す方法がたくさんあります。たとえば、インタプリタに引数として渡したり、sh script実行可能ファイルとして直接呼び出すことができます。この場合、#!/bin/shshebang行(たとえば)のインタプリタが実行のために呼び出されます。どちらの場合も、スクリプトはシェル環境とは別の独自の環境を持つ別々のインタプリタプロセスによって実行され、スクリプトは何らかの方法でシェル環境に影響を与えることはできません。実際、インタプリタシェルは呼び出しシェルと一致する必要さえありません。この方法で呼び出されたスクリプトは通常の実行可能ファイルのように見えるため、すべてのプログラムで使用できます。

    最後に、スクリプトの読み取りと実行は現在のシェル.または一部のシェルで使用できますsource。この場合、スクリプトはメモリに保持されるのではなく、要求時に読み取る関数と非常によく似ています。

アプリケーション

上記を考慮して、何かをスクリプトにするのか、関数/別名にするのかに関するいくつかの一般的なガイドラインを思いつくことができます。

  • シェルに加えて、他のプログラムでそれを使用できる必要がありますか? その場合はスクリプトでなければなりません。

  • インタラクティブシェルでのみ使用しますか? 外部コマンド/スクリプトに影響を与えずにインタラクティブに実行するときは、多くのコマンドのデフォルトの動作を変更することが望ましいことがよくあります。この場合、シェルの「対話モード専用」rcファイル(bashこの場合.bashrc)に設定されている別名/関数を使用してください。

  • シェル環境を変更する必要がありますか? 関数/エイリアスまたはソーススクリプトが可能なオプション。

  • 定期的に使用する製品ですか? メモリに保存する方が効率的である可能性があるため、可能であれば関数/エイリアスとして作成してください。

  • 代わりに、ほとんど使用しないのですか? このような場合は、不要なときにメモリを占有しておくことも役に立ちませんので、スクリプトで作ってみてください。


1関数とエイリアスの間にはいくつかの重要な違いがありますが、関数はエイリアスが実行できるすべての操作を実行できるため、一緒にグループ化されます。エイリアスはローカル変数を持つことができず、パラメータを処理できず、1行より長いものについては不便です。

² Unix システムで実行中の各プロセスには環境通常、デフォルトのロケールや指定された実行可能検索パスなどのグローバルvariable=value構成設定を含む複数のペアで構成されます。LANGPATH

答え2

実際、エイリアス(通常)はコマンドのデフォルトオプションのみを変更しないでください。これは、コマンド名の単純なテキスト置換にすぎません。引数を実際に実行するコマンドに渡す以外は、引数として何もできません。したがって、単一のコマンドの前にパラメータのみを追加する必要がある場合は、エイリアスを使用できます。一般的な例は次のとおりです。

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

エイリアスよりも複雑な操作を実行する必要がありますが、関数自体が役に立たない場合は、関数を使用する必要があります。例えばこの回答私が質問した質問に関して、grepデフォルトの動作はパイプラインで変更されているかどうかによって決まります。

grep() { 
    if [[ -t 1 ]]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

これはエイリアスと比較して複雑すぎるため(条件によっては異なるデフォルト値が必要です)、関数の完全な例ですが、非対話型スクリプトでは必要ではありません。

関数が多すぎるか、関数が大きすぎる場合は、隠しディレクトリに別のファイルを配置し、次の場所にソースを保存してください~/.bashrc

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

スクリプトはそれ自体で存在する必要があります。再利用またはさまざまな目的に使用できる価値があるはずです。

答え3

みんなの好みにかかっていると思います。私にとってロジックは次のとおりです。

  • まずエイリアスを作ってみました。それが最も簡単だったからです。
  • 一行で表現するには複雑すぎる内容があれば関数に変換しようとします。
  • 関数が12行以上に大きくなり始めたら、それをスクリプトに入れます。

あなたが何かをすることを制限することは本当に何もありません働く

答え4

スクリプトをいつ作成するか...

  • スクリプトは、ソフトウェアコンポーネント(ツール、コマンド、プロセス、実行可能ファイル、プログラムとも呼ばれます)をより複雑なコンポーネントに組み立て、そのコンポーネント自体をより複雑なコンポーネントに組み立てることができます。
  • スクリプトは通常実行可能なので、名前で呼び出すことができます。呼び出されると、スクリプトを実行する新しいサブプロセスが作成されます。 edexport変数および/または関数のコピーは次のとおりです。値として渡すスクリプトに。これらの変数が変更された場合いいえ親スクリプトに再度伝播します。
  • スクリプトは、呼び出しスクリプトの一部であるかのようにロード(ソース提供)することもできます。これは、他の言語で「インポート」または「含む」と呼ぶのと似ています。ソーシングされると、既存のプロセス内で実行されます。子プロセスは作成されません。

関数を書くとき...

  • 関数は実際にプリロードされたシェルスクリプトです。パフォーマンスは別のスクリプトを呼び出すよりも少し優れていますが、メカニカルディスクから読み取る場合にのみ可能です。今日、フラッシュドライブ、SSD、および未使用のRAMにあるLinuxの一般的なキャッシュが広がるにつれて、これらの改善はほとんど測定できませんでした。
  • 関数は、bashがモジュール化、カプセル化、および再利用を達成する主な手段です。スクリプトの明確さ、信頼性、保守性が向上します。
  • 関数呼び出しの構文規則は、実行可能ファイル呼び出しの構文規則と同じです。実行ファイルの代わりに、実行ファイルと同じ名前の関数が呼び出されます。
  • 関数は、その関数が配置されているスクリプトに対してローカルです。
  • 関数をエクスポートできます(値にコピー)呼び出しスクリプトで使用できます。したがって、関数は親プロセスではなく子プロセスにのみ伝播されます。
  • 関数は、他のスクリプトが選択できるように、ライブラリ(関数定義のみを持つスクリプト)に組み込まれる再利用可能なコマンドを生成します。

エイリアスを作成する場合...

ライブラリスクリプトなどのスクリプトでは関数名が変更されましたが、以前のバージョンとの互換性が必要な場合など、関数のエイリアスが必要な場合があります。これは、すべての引数を新しい関数に渡す古い名前の単純な関数を生成することによって実現できます。

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }

aliasこのコマンドと他のシェルの包括的な説明は次のとおりです。bashウィキペディア/エイリアス(コマンド)

関連情報