私は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
。
したがって、エイリアスと関数を混在させないでください。エイリアスの使用による影響に注意してください。エイリアスは実際にエイリアスではないからです。注文するむしろそれは一種の巨視的な拡張の形です。
答え2
テスト関数を開発するときは、source
各編集間で関数定義を再ロードする必要があります。それ以外の場合、以前の関数定義は引き続きアクティブになります。関数にタイプミスがなく、対応するエラーメッセージを表示しないでください(ここでは再現できません)。これは、関数を書いたように実行していないという意味です。
また、スクリプト中に使用する$HOME
よりも始めることをお勧めします。主に変数のように動作しないためです(参照~
~
二重引用符の中でチルダ(〜)が拡張されないのはなぜですか?)。
提案:
edit_profile () {
local EDITOR=${EDITOR:-vim}
local file="$HOME/.profile"
"$EDITOR" "$file" && source "$file"
}
変数file
は追加ですが、EDITOR
変数がすでに適切なエディタに設定されている可能性があります。それ以外の場合、コードはこれをに設定しますvim
。