Bourne シェルにエイリアスを設定する

Bourne シェルにエイリアスを設定する

私は "SH -c command"コマンドを含むスクリプトを使用しています。ここで command は、Bourne シェルとして解釈されない bash のエイリアスです。このエイリアスをBourneシェルに設定し、新しいシェルで動作するようにする方法についてのアイデアはありますか?みんなありがとうございます!

答え1

これがLinuxの実際のBourneシェルであれば驚きます。 Bourne シェルは Linux に移植されましたが、通常はデフォルトでインストールもパッケージもされません。

考古学目的でのみ設置できます。

shおそらく、Bourneシェル(現在はインタプリタや他のPOSIXsh言語とも呼ばれます)(また、古代シェルとも呼ばれますsh(現代sはBourneシェルから派生しましたが、shそれでも異なります))について混乱している可能性があります。

Bourne シェルにはエイリアスはありません。現代shはします。

ただし、エイリアスは現在シェルにローカルです。新しいシェル(bash、、、、...)を実行すると、sh新しいシェルはこれらのエイリアスを継承しません。cshzsh

新しいシェルでこれらのエイリアスを再定義する必要があります。

bashと互換性のある構文で別名の1つの定義をダンプする方法がありますsh。だからあなたはこれを行うことができます:

alias foo='echo foo' # alias defined in bash
foo_definition=$(alias foo)
sh -c "$foo_definition
foo"

または簡単に:

sh -c "$(alias foo)
foo"

もう1つの問題は、これがうまくいかないことですsh。最初に目立つのは、私たちがこれをしないということです:

sh -c "$(alias foo);foo"

どちらが機能しますか?いいえ sh実装する。

エイリアスは実際にはマクロの拡張と似ているからです。エイリアス拡張は構文解析の前に実行されるため、コマンドを実行alias foo='echo foo'; fooすると、そのalias行はすでに構文解析されています。

エイリアス定義を1行に配置して次の行に使用すると、一部のシェルの問題は解決されますが、他のシェル(またはなどyashzshsh -cコード全体を完全に解析するため、エイリアス拡張は機能しません。

ただし、エイリアスは一部のテキストを別のテキストに置き換えるマクロなので、手動で置き換えることをお勧めします。

次のようにしてエイリアス値を取得できます。

eval "$(alias foo | sed '1s/ /_/')"

エイリアスの定義を変数fooに保存します。$alias_foo

その後、次のことができます。

sh -c "$alias_foo"

エイリアス値をfooシェルコードに渡しますsh

この目的のために、エイリアスの代わりに関数を使用する方が良いかもしれません。エイリアスと同様に、関数は現在のシェルにローカルです。一部のシェルは、同じインタプリタの他の呼び出しとrc同じ機能をエクスポートできます。bash

foo() { echo foo; }
export -f foo
sh -c foo

sh実装されたシステムでのみ利用可能ですbash(主にApple OS / Xおよび一部のLinuxベースのシステムのみ)。

より移植性の高いアプローチは、エイリアスを使用して関数定義を渡されたコードにダンプすることですsh -c

sh -c "$(typeset -f foo); foo"

今回は、関数が言語の実際の構成なので、エイリアスではなく関数で拡張時間と解析時間に問題はありません。

ただし、関数定義に構文的に有効でsh拡張機能を使用しないコードが含まれていることを確認する必要がありますbash

答え2

特にBashの場合 -

これは、Bash を使用してコマンドを実行すると-c非対話モードで起動され、特にエイリアス拡張が無効になるために発生します。

通常、スクリプトにエイリアスを使用しないでください。代わりに、シェル関数や他のスクリプトを使用してください。もしあなたなら本物エイリアスを使用したい場合はお試しくださいbash -ic <alias_command>。対話モードでシェルを起動し、-i構成ファイル(例:)を読み、/.bashrcエイリアス拡張を有効にします。

注 – Bash に表示されるエイリアスは、親シェルではなく構成ファイルから来ます。

関連情報