cat /sys/devices/cpu/caps/pmu_name
haswell
Используйте массив и проверьте, является ли первый элемент (т. е. [0] в bash, [1] в zsh )массива каталогом. например. вbash
:
# the trailing slash in "$HOME"/.gem/ruby/*/bin/ ensures that
# the glob matches only directories.
rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )
if [ -d "${rubygemdirs[0]}" ] ; then
echo "At least one ruby gem dir exists"
else
echo "No ruby gem dirs were found"
fi
Чтобы работать как в zsh
, так и в bash
, вам нужно сначала выяснить, какая оболочка запущена в данный момент. Это скажет вам, является ли первый индекс массива 0
или 1
. Это также определит, нужно ли вам использовать (N)
с glob, чтобы указать zsh НЕ выходить, если нет совпадений для glob (zsh завершит работу по умолчанию при ошибках сопоставления glob ).
(в этот момент должно стать очевидным, что написание скрипта для надежной работы в как в bash, так и в zsh, вероятно, принесет больше проблем, чем пользы)
if [ -n "$BASH_VERSION" ] ; then
first_idx=0
rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )
elif [ -n "$ZSH_VERSION" ] ; then
first_idx=1
emulate sh
rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )
emulate zsh
fi
if [ -d "${rubygemdirs[$first_idx]}" ] ; then
...
При необходимости вы также можете выполнить итерацию по массиву, чтобы проверить, соответствует ли элемент определенной версии. например.
for d in "${rubygemdirs[@]}" ; do
[[ $d =~ /2\.6\.0/ ]] && echo found gem dir for ruby 2.6.0
done
Обратите внимание, :/
в регулярном выражении — это буквальные -косые черты. Они не отмечают начало и конец регулярного выражения, как в sed
.
Не думаю, что имеет смысл искать какой-либо каталог. Какой смысл использовать каталог, который не соответствует установленной версии Ruby? А что, если пользователь настроил другой каталог в ~/.gemrc
?
Я не очень хорошо знаком с Ruby, но думаю, что правильным решением будет взять первую запись в gempath
.
ruby_gem_home=$(gem environment gempath | sed 's/:.*//')
if [ -z "$ruby_gem_home" ]; then unset ruby_gem_home; fi
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
}
Квалификатор globN
гарантирует, что результатом будет пустой массив, а не ошибка, если совпадений нет. Квалификаторы 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
сортируется перед 9
.