zshで関数を書く正しい方法

zshで関数を書く正しい方法

git add --all; git commit -m "some commit message"; git pushプロジェクトを操作するときは、最新のタスクをリモートリポジトリにプッシュするためにこれらのコマンドを順番に実行する必要があることがよくあります。

.zshrc私はこれら3つのコマンドをカプセル化する関数を書いて、シェルを起動するたびに使用できるようにファイルに保存するのが最善だと思いました。だから私は次の関数を書いた。

gp() {
    git add --all
    git commit -m "$*"
    git push
}

export -f gp

ファイルを取得したり、.zshrc新しいシェルセッションを開始したとき。次のエラーが発生します。

parse error near `()'

関数定義の正しい構文をオンラインで確認しましたが、上記の関数が私に合うようです。このエラーを解決する方法がわかりません。助けてくれて本当にありがとうございます。

答え1

function-name() command

は1980年代初頭にBourneシェルでサポートされているいくつかの関数定義構文の1つなので、zshコードのこの部分は問題ありません。

エラーが発生した場合、parse error near `()'パーサーが最初に関数定義を必要としないためである可能性が高くなります。

たとえば、次のエラーが発生します。

case x in
gp() {
  body
}

afterと同様に、zshには関数定義ではなく、ケースパターンcase x inが必要です。esac

したがって、問題は表示されていないzshrc部分のどこかにある可能性があります。 Microsoft Windowsシステムでスクリプトを編集するときなど、スクリプトがMSDOS行末(LFではなくCRLF)でフォーマットされている場合でも、構文エラーが頻繁に発生します。dos2unixこれらの問題を解決するために使用できます。

それ以外の場合、これはexport -f function-namebash 専用の機能です。

zshに渡すことはできますが、この危険な関数に対応する関数はありません~/.zshenv

"$*"これはまた、shあなたがすることです/bashなぜなら、彼らはそれを行うより良い方法がないからです。これは$IFS、当時の内容が何であれ、位置引数をの最初の文字に関連付けます。では、zshサイコロロールのままにするのではなく、パラメータ拡張フラグに関連付けるときに使用する区切り文字を明示的に指定できますj${(j[ ])@}たとえば、位置パラメータをスペースに関連付けます。

関連情報