システムの基本 $PATH で which(1) を使用するには?

システムの基本 $PATH で which(1) を使用するには?

whichユーザーシェル設定ファイルの変更を無視し、システムのデフォルトパスを使用したいと思います。

やる気

私のシステムのRubyバイナリを見つけるためのスクリプトを書こうとしています。多くのRuby開発者はRubyバージョンマネージャを使用し、それ自身~/.rvm/bin$PATH

現在のソリューション

これが私が今まで試したことです:

$ env -i sh -c "which ruby"

これは出力を提供せずに1で終了します。パスには次のものが含まれており/usr/bin、私のシステムにRubyバイナリが付属しているので、うまくいくと思います/usr/bin/ruby

$ env -i sh -c "echo \$PATH"
/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:.
$ which -a ruby
# ...
/usr/bin/ruby

いくつかの追加の詳細:

  • env -s bash -c "which ruby"何も見つかりませんでした。
  • env -i zsh -c "which ruby"実際に見つけ/usr/bin/rubyたが信じられないzsh
  • フルパスを使用するとwhich(シェル組み込みではなくバイナリを使用していることを確認するために)、違いはありません。

私の環境

私はOS XのBashでこの記事を書いていますが、他のシェルやオペレーティングシステムに移植できることを願っています。

ベストアンサー1

command -pv「PATHのデフォルト値」を使用してください。

$ which ruby
/home/mikel/.rvm/rubies/ruby-1.9.3-p484/bin/ruby

$ command -pv ruby
/usr/bin/ruby

残念ながらこれはうまくいかないので、zshStephaneの意見に基づいて以下を使用できますgetconf PATH

$ PATH=$(getconf PATH) which ruby

またはcommand -v提案されているようにwhich使用してください。「which」を使わないのはなぜですか?それでは何を使うべきですか?

$ PATH=$(getconf PATH) command -v ruby

この方法の欠点は、システム管理者が/usr/local/binたとえばシステム/opt/local/bin全体のバージョンをインストールすることです。PATH/etc/profile/etc/environment

状況に応じてRuby関連のアプローチを試してみることをお勧めします。以下は、効果があるかもしれないいくつかのアイデアです。

  1. ユーザーのホームディレクトリ(および相対パス)からバージョンをフィルタリングします。

    (
        IFS=:
        set -f
        for dir in $PATH; do
            case $dir/ in
                "$HOME/"*) ;;
                /*/)
                    if [ -f "$dir/ruby" ] && [ -x "$dir/ruby" ]; then
                        printf '%s\n' "$dir/ruby"
                        break
                    fi;;
            esac
        done
    )
    
  2. rvm ディレクトリのバージョンをフィルタリングします。

    (
        IFS=:
        set -f
        for dir in $PATH; do
            case $dir/ in
                "$rvmpath/"*) ;;
                /*/)
                    if [ -f "$dir/ruby" ] && [ -x "$dir/ruby" ]; then
                        printf '%s\n' "$dir/ruby"
                        break
                    fi;;
            esac
        done
    )
    
  3. 書き込み可能なルビーフィルタリング(最後の手段、ルートとして実行されないと仮定)

    (
        IFS=:
        set -f
        for dir in $PATH; do
            case $dir/ in
                /*/)
                    ruby=$dir/ruby
                    if [ -f "$ruby" ] && [ -x "$ruby" ] && [ ! -w "$ruby" ]; then
                        printf '%s\n' "$ruby"
                        break
                    fi;;
            esac
        done
    )
    
  4. 尋ねてrvmくださいchruby。しばらくしてください。

    (
        rvm system
        chruby system
        command -v ruby
    )
    

最後の方法はデフォルトのrvmRubyを選択しますが、後でユーザーが好むRubyを復元できるようにサブシェルでこれを行います。 (chruby部分的にテストされていません。)

おすすめ記事