スクリプトでglobを使用してサブディレクトリがあることを確認する

スクリプトでglobを使用してサブディレクトリがあることを確認する

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"
}

ここでは通常、常に最新バージョンではありませんが、最後の配列要素を使用します。10sorted before 9

おすすめ記事