シェルスクリプトを使用して上書きするときに元のコマンドを検索するパスは何ですか?

シェルスクリプトを使用して上書きするときに元のコマンドを検索するパスは何ですか?

私は他のコマンドの実行をラップするためにラッパースクリプトを書いています。この場合はChefkitchenコマンドです。 bashで実行すると、ラッパースクリプトが実行されるように私のスクリプトも呼び出され、kitchen事前に配置されます。$PATHkitchen

問題は元のバージョンを呼び出す方法ですkitchen。もちろん、最も確実な方法は、フルパスを提供することです。/usr/bin/kitchenスクリプトにパスを入力するだけですが、他の人が別のパスにインストールすることもできます。もちろん、これは他のラッパースクリプトを除外します。ソリューションがスタック可能であれば良いでしょう。

私は同じトピックを扱う2つのアプローチを考えました。

  1. スクリプトで$PATH各エントリを比較し、デバイス番号とinode番号を$(dirname "$0")使用して同じディレクトリであることを確認します。statその場合はそれを削除してください$PATH。その後、kitchenラッパースクリプトを再度呼び出すべきではないので、呼び出すことができます。
  2. #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

関連情報