環境: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
私たちに教えてください。