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
残念ながらこれはうまくいかないので、zsh
Stephaneの意見に基づいて以下を使用できます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関連のアプローチを試してみることをお勧めします。以下は、効果があるかもしれないいくつかのアイデアです。
ユーザーのホームディレクトリ(および相対パス)からバージョンをフィルタリングします。
( 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 )
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 )
書き込み可能なルビーフィルタリング(最後の手段、ルートとして実行されないと仮定)
( 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 )
尋ねて
rvm
くださいchruby
。しばらくしてください。( rvm system chruby system command -v ruby )
最後の方法はデフォルトのrvm
Rubyを選択しますが、後でユーザーが好むRubyを復元できるようにサブシェルでこれを行います。 (chruby
部分的にテストされていません。)