Передача имени каталога в оператор запуска Ruby

Я использую rerun и sinatra настолько, что мне нужен хороший псевдоним, чтобы я мог выполнить rerun ruby X.rb, где X был текущим каталогом (т.е.: /Users/David/Documents/Projects/sample=>rerun ruby sample.rb).

Команда, которую я использую (адаптировано из this вопрос) alias sin="rerun ruby ${PWD##*/}.rb". Когда я использую это, он говорит ruby: No such file or directory -- David.rb (LoadError), как будто ему была передана моя пользовательская папка вместо папки проекта.

Однако, когда я вручную запускаю свой .zshrc (alias sz="source ~/.zshrc", который должен запускаться при создании оболочки (и все мои другие псевдонимы работают нормально, поэтому у меня нет причин полагать, что он не будет работать)) и снова запускаю sin, он полностью работает как предполагалось.

Любые идеи? Я новичок в написании сценариев bash. Кроме того, я использую zsh, если это важно.


person xavdid    schedule 06.05.2014    source источник


Ответы (1)


Общее правило относительно псевдонимов: «если вам нужно спросить, используйте вместо этого функцию»:

sin() {
  rerun ruby "${PWD##*/}.rb"
}

который работает, как ожидалось.

Конкретная проблема в вашем случае заключается в том, что ${PWD##*/} расширяется, когда вы определяете псевдоним, а не при его запуске. Вы также можете исправить это, используя одинарные кавычки в определении:

alias sin='rerun ruby "${PWD##*/}.rb"'
person that other guy    schedule 06.05.2014
comment
Благодаря тонну! Я даже не знал, что в конфигурационных файлах можно создавать такие функции. В основном я использую псевдонимы для статических вещей, которые я устал печатать (например, alias zshow="defaults write com.apple.finder AppleShowAllFiles TRUE; killall Finder"). Хотя это здорово! - person xavdid; 07.05.2014