私は他のコマンドの実行をラップするためにラッパースクリプトを書いています。この場合はChefkitchen
コマンドです。 bashで実行すると、ラッパースクリプトが実行されるように私のスクリプトも呼び出され、kitchen
事前に配置されます。$PATH
kitchen
問題は元のバージョンを呼び出す方法ですkitchen
。もちろん、最も確実な方法は、フルパスを提供することです。/usr/bin/kitchen
スクリプトにパスを入力するだけですが、他の人が別のパスにインストールすることもできます。もちろん、これは他のラッパースクリプトを除外します。ソリューションがスタック可能であれば良いでしょう。
私は同じトピックを扱う2つのアプローチを考えました。
- スクリプトで
$PATH
各エントリを比較し、デバイス番号とinode番号を$(dirname "$0")
使用して同じディレクトリであることを確認します。stat
その場合はそれを削除してください$PATH
。その後、kitchen
ラッパースクリプトを再度呼び出すべきではないので、呼び出すことができます。 - #1に似ていますが、
$PATH
スクリプトで手動で検索し、stat
各結果にvs.を使用します$0
。自分が見つかるまでスキップして探し、次の項目を使用します。私たちが自分自身を見つけることができない場合は、正常に実行します(ラッパーは含まれていませんが、そのパスを指定して$PATH
実行された場合を処理するため)。
もっと良い方法がありますか?それとも、これを行うコードは、一般的なDebianまたはUbuntu Linuxシステムにすでに存在していますか?
答え1
私は過去に似たようなことを何度もやったことがcommand kitchen
ありmy-kitchen
ました。
alias kitchen=/path/to/my-kitchen
しかし、これがあなたのユースケースに適しているかどうかはわかりません。
答え2
エイリアスがバックスラッシュにエスケープされ、シェルから拡張されるのを防ぎます。 command
また動作します。
kitchen
私のデスクトップには1つもないので、別名でpwd
説明しますuname -r
。
$ alias pwd='uname -r'
$ pwd
5.10.0-8-amd64
$ \pwd
/home/cas
$ command pwd
/home/cas
$ unalias pwd
$ pwd
/home/cas
答え3
kitchen
次の作品をやりたいと思いますね$PATH
。
#!/bin/bash
me="$0"
foundit=""
for d in $( echo "$PATH" | tr ":" " " ) ; do
if [[ $foundit == "" ]] ; then
if [[ "$me" != "$d/kitchen" ]] ; then
if [[ -x "$d/kitchen" ]] ; then
foundit="$d/kitchen"
fi
fi
fi
done
# the next "kitchen" is in "`$foundit`"
# read `man bash`, about the `eval` and `exec` builtins