編集2:

編集2:

私は別のスクリプトで実行可能ファイルを使用していましたが、/usr/bin/foo少し奇妙に動作していたので、同じファイル名を持つBashラッパーを作成し、/usr/local/bin/fooその中で誤った動作を修正しました。私のPATHもの/usr/local/bin:/usr/bin。ラッパースクリプトでは、無限ループに陥らないように絶対パスを介して元の実行可能ファイルを実行する必要があります。

$ cat /usr/local/bin/foo
#/bin/zsh
/usr/bin/foo | grep -v "^INFO" # reduce output

foonext inを実行する簡単な方法(おそらくZshまたはBash固有)はありますかPATH?つまり、 current が実行されるディレクトリの次のディレクトリでfoo元の実行ファイルの絶対パスを使用する必要はありませんか?PATHfoo

私はそれのための関数を作ることができます/etc/zshenv。あまりありません。もし基準があるのか​​知りたいです。エイリアスを使用したり、元の実行可能ファイルを回復したくありません。


編集 1: = $ cat /usr/local/bin/foo #/bin/zsh path=(${path/#%$0:A:h}) foo | grep -v "^INFO" # 出力を減らす

これにより、現在の実行可能ファイル()の絶対()ディレクトリ()と正確に一致する()PATH()の${path/...}すべての文字列が消去されます(ただし保存されます)。正直言って、StackExchangeで組み立てましたが、完全には理解していませんでした。私はそれが私を噛まないことを願っています。#%:A:h$0

編集2:

$ cat /usr/local/bin/foo
#/bin/zsh
path[${path[(i)$0:A:h]}]=() foo | grep -v "^INFO" # reduce output

$path[(i)foo]foo配列のインデックスを検索するpathか、1に配列長を加えた値を見つけます。

ベストアンサー1

スクリプトがあるディレクトリ($0:hzsh、"${0%/*}"in sh)を見つけて、そのディレクトリから削除できますPATHpath=(${path:#$0:h})zsh、shでもっと複雑。同じディレクトリが2回含まれている場合PATH(たとえば、シンボリックリンクを介して)、この操作は失敗する可能性があります。

直接アプローチの欠点は、パスからディレクトリが削除されるが、同じディレクトリにある他のプログラムが理想的である可能性があることです。パスの検索に変更されたパスのみを使用すると、この問題を解決できます。

next=$(path=(${path:#$0:h}); print -lr -- =$0:t)
$next

代わりにPATH手動で照会を実行し、実行中のスクリプトをスキップします。

for d in $path; do
  if [[ -x $d/$0:t && ! $d/$0:t -ef $0 ]]; then
    exec $d/$0:t
  fi
done

おすすめ記事