コマンド 'SH -c command'でscrtiptを使用しています。ここで、commandはbashからのエイリアスであり、このエイリアスはBourneShellに解釈できません。 ¿このエイリアスをBourneShellに設定し、新しいシェルで機能させるためのアイデアはありますか?みんな、ありがとう !
Linux上にある本物のBourneShellだとしたら、私は驚きます。 Bourne Shellは現在Linuxに移植されていますが、通常、デフォルトではインストールもパッケージ化もされていません。
考古学の目的でのみインストールします。
sh
(現在はPOSIX sh
言語のインタープリターまたは別の言語を指します)とBourne Shell(以前はsh
とも呼ばれていた(そして現代のsh
sの子孫ですが、異なる))と混同しているかもしれません。
BourneShellにはエイリアスがありませんでした。現代のsh
はそうします。
ただし、エイリアスは現在のシェルに対してローカルです。新しいシェルを実行すると(bash
、sh
、csh
、zsh
...)、その新しいシェルはそれらのエイリアスを継承しません。
新しいシェルでこれらのエイリアスを再定義する必要があります。
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行に配置し、次の行でその使用法を使用すると、一部のシェルではそれを回避できますが、他の一部(yash
やzsh
など)はsh -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
拡張子を使用しないコードが含まれていることを確認する必要があります。
特にBashについて話す-
これは、Bashに-c
を使用してコマンドを指定すると、非対話モードで起動し、特にエイリアス拡張が無効になるために発生します。
一般に、スクリプトでエイリアスを使用するのではなく、シェル関数または他のスクリプトを使用する必要があります。 本当にエイリアスを使用したい場合は、bash -ic <alias_command>
を試してください。 -i
は、インタラクティブモードでシェルを起動し、/.bashrc
などの構成ファイルを読み取り、エイリアス拡張を有効にします。
注-Bashが認識するエイリアスは、親シェルからではなく、構成ファイルから取得されます。