/bin/bashと「.」の違い

/bin/bashと「.」の違い

環境:Ubuntu 14.04

bc私のホームフォルダにファイル名があります。ファイルの内容全体は次のとおりです。

func() {
    local a b=()
    echo $0
}
func

#!/bin/bashちなみに最初は何もありません。

それから私がそうすれば私/bin/bash ~/bcは得ます。

/home/dev/bc

予想通り。

ただし、代わりにインポートすると、. ~/bc次のエラーが発生します。

bash: /home/dev/bc: line 2: syntax error near unexpected token `('
bash: /home/dev/bc: line 2: `    local a b=()'

購入のために別のシェルが実行されているとします。この場合、どのように変更できますか?

私が1つすればchsh私は得る。

dev@c1:~$ sudo chsh
[sudo] password for dev: 
Changing the login shell for root
Enter the new value, or press ENTER for the default
    Login Shell [/bin/bash]: 

------コメント中---------

echo $SHELL返品/bin/bash

ベストアンサー1

問題はほぼ確実にエイリアシングです。これを行うとき:

/bin/bash somefile

新しいシェルをロードします。新しい始まりになります。実行ファイルには、初期化ファイルに入れた内容はすべて含まれていません。RCs - これは基本的に対話型シェルでのみ起動されるため、後で生成される他のロジックは言うまでもありません。

エイリアスが変です。エイリアスはパーサー拡張です。ほとんどのシェルでサポートされている最初の拡張可能なオブジェクトであり、多くの人が期待しない方法で拡張されます。bash実際、何らかの理由でalias非対話型シェルでデフォルトで拡張機能を無効にすると、その機能の使用が防止されます。したがって、エイリアスがエラーを引き起こす場合(私はこれが問題であると確信しています)、環境ファイルをソースしても同じエラー出力が発生しない可能性があります/bin/bash

エイリアスが奇妙だと言うのは、拡張レベルが他の種類のシェル拡張と異なるためです。これは、おそらくシェル拡張が行われない関数定義の文脈で最も明白です。なぜなら、これらの拡張は後で関数実行のために予約されているからです。エイリアスを除く式を2回評価する必要はありません。エイリアスは次のとおりです。いいえ拡大する期間機能の実行(もう一度言うが欠けているeval、なぜ彼らすでに定義中に拡張されました。

例は次のとおりです。

alias a='echo not a;b'
b(){ echo a\?; }; a(){ echo le sigh...; }
a; b

...印刷...

not a
not a
le sigh...
le sigh...

alias命名が初めて拡張されるときは、a次のようになります。

a(){...

()これは括弧が予約語ではなくシェルトークンであるためです{}。したがって、スペースなしで単語を区別できます。これは、パーサが実行可能文に到達するためにマクロ拡張を実行するため、関数や配列宣言などの操作に特に役立ちます。上記の拡張の結果は次のとおりです。

}; echo not a;b(){ 

最後の展開変換:

a; b

...入力する...

echo not a;b; b

一般的なシェル拡張は、事前に分離されたコンテキストで発生します。すべての側面は、次の制御演算子によって制限されます。

\n[]{}|&();<>\'"`

このように、ほとんどのシェル拡張自体は引用メカニズムとして機能します。変数で拡張された引用は拡張で引用を引用するため、追加の引用のコンテキストは再帰的に制限されません。ただし、これより先にエイリアス拡張が発生します。単純なコマンドで最初のシェルワードをスキャンするときにパーサーがエイリアスを認識すると、残りをスキャンする前にエイリアスが拡張されます。したがって、拡張結果が単純なコマンド以上のものであれば、そうします。

私の仮定は、あなたが最も簡単な説明になるというalias声明を持っているということですfunc。ただし、エイリアスは末尾のスペースとして定義されている場合は連結でき、また拡張されます。以内に機能定義 - あなたが提供した情報だけでは決定することはできません。しかし、私はあなたのエラーを再現できると思います。これは近いです:

alias func='func('
func(){
    local a b=()
    echo $0
}
func

...印刷...

bash: syntax error near unexpected token `('
bash: local: can only be used in a function
bash
bash: syntax error near unexpected token `}'
bash: syntax error near unexpected token `newline'

だからこうしてください:

alias func local a b echo

私たちに教えてください。

おすすめ記事