Bashの機能、何か奇妙なことが起こっている!

Bashの機能、何か奇妙なことが起こっている!

私はbash機能に初めて触れましたが、作業速度を上げるためにいくつかのコンテンツを作成し始めました。私はこれをテストするのが好きなので、私の〜/ .profileを頻繁に編集し、インポートして~/.入力するのが少しぎこちないことがわかります...

だから私が最初にすることは次のとおりです。

sourceProfile(){
    source ~/.profile
}

editProfile(){
    vim ~/.profile && sourceProfile
}

editProfileを実行すると、sourceProfileの呼び出しに問題があります。最初はエラーが発生しました。

-bash: ~./profile: No such file or directory

私の機能にはタイプミスはありません。

しかし、エイリアスを使用すると機能します。

alias sourceProfile='source ~/.profile'

しかし、対応するエイリアスを追加してからコメントアウトし、関数のコメントアウトを削除した後に構文エラーが発生し始めました。

-bash: /home/jonathanramsden/.profile: line 45: syntax error near unexpected token `('
-bash: /home/jonathanramsden/.profile: line 45: `sourceProfile(){'

行は次のとおりです

alias sservice='sudo service'

私がしたことはコメント/コメントのキャンセルだけだったと確信しています!私のインターネット検索によると、これは関数を定義する構文のようです。

ベストアンサー1

エイリアスはCの前処理と同様のマクロ拡張のようなものです#defineが、シェルでは前処理ステップと解釈ステップの間に明確に見える境界がなく(また、別名はすべてのコンテキストで拡張されていない)、いくつかあります。ネストされたエイリアスと同様に、エイリアス拡張ラウンド)。

これを行うとき:

alias sourceProfile='source ~/.profile'
sourceProfile() {
  something
}

エイリアス拡張はこれを次のように置き換えます。

source ~/.profile() {
  something
}

構文エラーです。そして:

alias sourceProfile='source ~/.profile'
editProfile(){
  vim ~/.profile && sourceProfile
}

次に変更してください。

editProfile(){
  vim ~/.profile && source ~/.profile
}

sourceProfileしたがって、後で関数として再定義すると、定義に元のエイリアスの拡張値があるためeditProfile呼び出されません。editProfile

また、機能(または複合コマンド)の場合、エイリアスは次の場合にのみ使用されます。機能定義実行時以外の時間(読み取りおよび解析時)。だからこれ:

editProfile(){
  vim ~/.profile && sourceProfile
}
alias sourceProfile='source ~/.profile'
editProfile

sourceProfile関数の本文を解析するときは定義されておらず、editProfile関数を実行するとエイリアス拡張がないため機能しませんeditProfile

したがって、エイリアスと関数を混在させないでください。エイリアスの使用による影響に注意してください。エイリアスは実際にエイリアスではないからです。注文するむしろそれは一種の巨視的な拡張の形です。

おすすめ記事