私は別のスクリプトで実行可能ファイルを使用していましたが、/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
foo
next inを実行する簡単な方法(おそらくZshまたはBash固有)はありますかPATH
?つまり、 current が実行されるディレクトリの次のディレクトリでfoo
元の実行ファイルの絶対パスを使用する必要はありませんか?PATH
foo
私はそれのための関数を作ることができます/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:h
zsh、"${0%/*}"
in sh)を見つけて、そのディレクトリから削除できますPATH
(path=(${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