Как установить псевдоним внутри скрипта оболочки bash, чтобы он был виден снаружи? - PullRequest
59 голосов
/ 04 февраля 2010

OSX: это работает из командной строки:

alias ruby="/opt/local/bin/ruby1.9"

но на стороне сценария оболочки это никак не сказывается. Я хочу написать скрипт, который будет переключаться между ruby ​​1.8 и ruby ​​1.9, так что это должен быть скрипт, а не в моем профиле.

Похоже, "source script.sh" работает, но "./script.sh". Почему это? Как я могу повторить это в моем сценарии?

Ответы [ 4 ]

100 голосов
/ 28 июля 2010

Простой ответ для вас заключается в том, что скрипты создают неинтерактивные оболочки, и по умолчанию опция expand_aliases часто отключена.

Вы можете исправить это очень просто, просто добавив следующую строку в начало вашего скрипта, чтобы включить расширение псевдонима:

shopt -s expand_aliases

Эта проблема вызывала у меня проблемы, поэтому я провел исследование, а затем написал сообщение в блоге, как только выяснил, как это исправить для себя: Пост об использовании псевдонима в скриптах оболочки Linux.

Конечно, сразу после того, как я выяснил эту часть, я обнаружил, что, хотя он работает для того, что вам нужно, он не будет работать, если у вас есть подоболочка внутри подоболочки. Я все еще ищу решение этой проблемы, вот как я только что натолкнулся на ваш вопрос. В сообщении в блоге я упоминаю дешевый хак, который я использую, чтобы получить псевдоним в сценарии оболочки. Это не элегантно, но на самом деле это работает даже в этой множественной проблеме подоболочки.

71 голосов
/ 04 февраля 2010

./script.sh будет выполнено в под-оболочке, и внесенные изменения будут применены только к под-оболочке.Как только команда завершается, суб-оболочка запускается, как и изменения.

получение файла с использованием . ./script.sh или source ./script.sh будет считывать и выполнять команды из аргумента имени файла в текущем контексте оболочки,то есть когда сценарий запускается с использованием source, он запускается в существующей оболочке, любые переменные, созданные или измененные сценарием, останутся доступными после его завершения.

7 голосов
/ 26 мая 2012

Если вам нужно переключить версии Ruby, попробуйте rvm .

7 голосов
/ 04 февраля 2010

Вы можете написать функцию в своем .profile для переключения псевдонимов

function toggle-ruby() {
  if [ "$1" == "1.9" ]; then
    alias ruby=/opt/local/bin/ruby1.9
  else
    alias ruby=/opt/local/bin/ruby1.8
  fi
}

затем запустите, вы можете запустить:

toggle-ruby 1.9

или

toggle-ruby 1.8

для переключения назад и вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...