bin
時々変更されるディレクトリ内にディレクトリがあるかどうかを確認しようとしています。この特別なケースでは、Rubyのバージョン番号が変更されることがあります(例$HOME/.gem/ruby/2.6.0/bin
:)。これまで私がしたことは次のとおりです。
#!/usr/bin/env zsh
ruby_gem_home="$HOME/.gem/ruby/*/bin"
if [[ -d $ruby_gem_home ]]; then
echo "The ruby gems directory exists!"
else
echo "Ruby gems directory missing!"
fi
find
これはログインプロセスの一部なので、使用したくありません。組み込みのzsh / bashコマンドを使用してこれを達成する最もエレガントな方法は何ですか?
ありがとうございます!
編集する:これがスクリプトであることを忘れましたzsh
。
ベストアンサー1
特にこの状況について
ディレクトリの検索には意味がないと思います。インストールされているRubyのバージョンと一致しないディレクトリを使用するのはなぜですか?ユーザーが別のディレクトリを設定した場合はどうなりますか~/.gemrc
?
私はRubyに精通していませんが、正しい解決策はgempath
。
ruby_gem_home=$(gem environment gempath | sed 's/:.*//')
if [ -z "$ruby_gem_home" ]; then unset ruby_gem_home; fi
zshから
function set_ruby_gem_home {
emulate -LR zsh
local dirs
dirs=($HOME/.gem/ruby/*/bin(NnOn))
if (($#dirs == 0)); then
unset ruby_gem_home
else
ruby_gem_home=$dirs[0]
fi
}
これグローバル予選 N
不一致が原因でエラーが発生するのではなく、結果が空の配列であることを確認してください。 glob修飾子を使用n
してOn
バージョン番号を減らしてリストを並べ替えます。一致する項目が複数ある場合は、別の項目を選択するにはこのオプションを調整してください。
バッシュから:
function set_ruby_gem_home {
local dirs
dirs=(~/.gem/ruby/*/bin(NnOn))
if (($#dirs == 0)); then
unset ruby_gem_home
else
ruby_gem_home=$dirs[0]
fi
}
バッシュから
function set_ruby_gem_home {
local dirs restore_options
restore_options=$(setopt +o)
shopt -s nullglob
dirs=(~/.gem/ruby/*/bin)
if (($#dirs == 0)); then
unset ruby_gem_home
else
ruby_gem_home=${dirs[${#dirs[@]}-1]}
fi
eval "$restore_options"
}
ここでは通常、常に最新バージョンではありませんが、最後の配列要素を使用します。10
sorted before 9
。