Подтвердить что ты не робот

Как установить псевдоним внутри оболочки bash script, чтобы он был видимым извне?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

shopt -s expand_aliases

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

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

Ответ 3

Вы можете написать функцию в вашем .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

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

Ответ 4

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