$ PATHのバイナリを変更するビルドスクリプトがあります($ PATH自体は編集しませんが、すでに$ PATHにあるフォルダにファイルを追加/削除します)。 zshのオートコンプリートは、ビルドに応答して追加/削除されたファイルを反映するように更新されないため、シェルを再起動するか、組み込みの「rehash」シェルを実行してオートコンプリートキャッシュを更新するように指示する必要があります。
私は自動的に rehash を実行することにしました。
build() {
~/bin/real_build && rehash
}
ただし、シェル機能は独自のサブシェルで実行されるため、rehashは私が使用している端末のシェルではなくサブシェルのキャッシュを更新します。だから私はこれを次のように変更しました。
alias build='~/bin/real_build && rehash'
ビルドにパラメータを渡さない限り動作します。 「clean」を渡すと実行したいです。
~/bin/real_build clean && rehash
しかし、これを行います:
~/bin/real_build && rehash clean
だから詰まった。エイリアスは使用できますが、パラメータを渡すことはできません。関数を使用できますが、実際にオートコンプリート項目を更新することはできません。両方を操作する方法はありますか?
答え1
通常の中括弧の代わりに関数本体の周りに括弧を使用しない限り、シェル関数は独自のサブシェルでは実行されません。あなたの関数は、私が見たすべてのzshバージョンで実行可能なハッシュを更新し、この動作を変更するオプションがないと思います。
答え2
source
おそらくこれが最善の選択だと思います。例は次のとおりです。
cat << EOF > foo
touch $1
chmod +x $1
rehash
EOF
foo
次のように実行します。
source foo bar
これがあなたの道にいるなら、bar
今することができます。
答え3
シェル関数はシェルスクリプトと同じ引数を使用します。"$@"
、$*
$1... $n
他のすべての操作も有効です。
この場合は、関数の引数を試してください$1
。
build() {
~/bin/real_build ${1} && rehash
}
""
real_buildスクリプトがそれをパラメータとして処理できない場合は、引用符を使用しないでください。
""
他と変わらない。
これは、特定の場所にパラメータが必要な「エイリアス」を生成するための良い方法です。