web-dev-qa-db-ja.com

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

コマンド 'SH -c command'でscrtiptを使用しています。ここで、commandはbashからのエイリアスであり、このエイリアスはBourneShellに解釈できません。 ¿このエイリアスをBourneShellに設定し、新しいシェルで機能させるためのアイデアはありますか?みんな、ありがとう !

2
Salvatore.isc

Linux上にある本物のBourneShellだとしたら、私は驚きます。 Bourne Shellは現在Linuxに移植されていますが、通常、デフォルトではインストールもパッケージ化もされていません。

考古学の目的でのみインストールします。

sh(現在はPOSIX sh言語のインタープリターまたは別の言語を指します)とBourne Shell(以前はshとも呼ばれていた(そして現代のshsの子孫ですが、異なる))と混同しているかもしれません。

BourneShellにはエイリアスがありませんでした。現代のshはそうします。

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

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

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"

さて、shのすべての実装で機能するとは限らないという欠点があります。最初に、私たちがしなかったことに気付くでしょう:

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

noshの実装で機能したはずです。

これは、エイリアスが実際には何らかの形式のマクロ展開のようなものだからです。エイリアスの展開は解析前に行われるため、alias foo='echo foo'; fooでは、aliasコマンドが実行されるまでに、行はすでに解析されています。

エイリアス定義を1行に配置し、次の行でその使用法を使用すると、一部のシェルではそれを回避できますが、他の一部(yashzshなど)はsh -cコード全体を解析するため、エイリアス拡張はそこで機能しません。 。

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

次の手順でエイリアスの値を取得できます。

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

これにより、fooエイリアスの定義が$alias_foo変数に格納されます。

次に、次のことができます。

sh -c "$alias_foo"

fooエイリアスの値をシェルコードとしてshに渡す。

そのためには、エイリアスよりも関数を使用する方がよい場合があります。エイリアスの場合と同様に、関数は現在のシェルに対してローカルです。 rcbashなどの一部のシェルは、同じインタープリターの他の呼び出しに関数をエクスポートできます。

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

shbashで実装されているシステムでのみ機能します(ほとんどの場合Apple OS/Xおよび一部のLinuxベースのシステムのみ)。

より移植性の高いアプローチは、エイリアスが関数の定義をsh -cに渡されるコードにダンプするようなものです。

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

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

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

3

特にBashについて話す-

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

一般に、スクリプトでエイリアスを使用するのではなく、シェル関数または他のスクリプトを使用する必要があります。 本当にエイリアスを使用したい場合は、bash -ic <alias_command>を試してください。 -iは、インタラクティブモードでシェルを起動し、/.bashrcなどの構成ファイルを読み取り、エイリアス拡張を有効にします。

注-Bashが認識するエイリアスは、親シェルからではなく、構成ファイルから取得されます。

1
Matei David