Я использую скрипт (к которому у меня нет прав записи), который создает несколько псевдонимов для настройки среды. Я хотел бы создать функцию bash для настройки моей среды, но кажется, что псевдонимы не сохраняются в теле функции.
Вот минимальный пример:
# aliases.sh
alias fooAlias='echo "this will never work!"'
,
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
,
Теперь, если я просто получу источник в aliases.sh
интерактивном режиме, все будет работать так, как ожидается:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Однако, если я вместо этого вызову функцию, определенную в моем .bashrc, он не распознает псевдоним после определения его определения:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Что здесь происходит? Что-то мне не хватает в области действия alias
команды при использовании в функции?
Изменить: я добавлю некоторые детали помимо минимального примера, чтобы пролить свет на то, что я пытаюсь достичь.
Для своей работы я разрабатываю и запускаю много программного обеспечения в кластере и / или сетке. У меня есть несколько проектов, которые требуют совершенно разных сред, таких как разные версии gcc, определенные выпуски программного обеспечения, конфигурации и пути к данным, а также различные переменные среды. Администраторы предоставляют сценарии для настройки различных вещей, обычно путем определения функций оболочки или псевдонимов, которые вызывают другие функции или псевдонимы или запускают различные сценарии. Для меня это черный ящик.
Я хотел бы настроить свои собственные различные среды с помощью одной команды. В настоящее время я делаю что-то вроде:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Эти команды обычно должны выполняться по порядку. Моя идея в основном заключалась в том, чтобы просто скопировать вышеупомянутые строки в функциональный блок, но, как показывает оригинальный пример, это просто не работает. Альтернативные обходные пути приветствуются!
setupLotsOfThings
, они просто не доступны самой функции. Они работают в оболочке, из которой вы вызвали функцию. В любом случае, если ваша функция использует только псевдонимы, почему бы просто не использовать псевдоним? Например:alias setupstuff="source aliases.sh"
.На самом деле, ваши псевдонимы доступны после загрузки функции! Вы можете использовать их в своей интерактивной оболочке или в вашей
.bashrc
после выполнения функции.Ограничение состоит в том, что псевдонимы в определении функции раскрываются при чтении определения функции, а не при оценке функции. Это ограничение bash. Так что это будет работать:
Но не это
Если вам нужны псевдонимы, которые можно использовать внутри функций и которые могут быть определены после анализа функции, вместо этого сделайте их функциями. Помните, что вы можете использовать
command
встроенную функцию для вызова внешней команды из функции с тем же именем.источник