Как установить псевдоним внутри оболочки bash script, чтобы он был видимым извне?
OSX: это работает из командной строки:
alias ruby="/opt/local/bin/ruby1.9"
но со стороны оболочки script он не действует. Я хочу написать script, который будет переключаться между ruby 1.8 и ruby 1.9, поэтому это должно быть script - не в моем профиле.
Похоже, что "источник script.sh" работает, но "./script.sh". Почему это? Как я могу воспроизвести это в моем script?
Ответы
Ответ 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.