Рефакторинг команды bash в команду tcsh - PullRequest
1 голос
/ 04 апреля 2019

У меня проблема с рефакторингом команды bash в tcsh-friendly. Я не очень хорошо знаю синтаксис tcsh, поэтому ошибка, которую я получаю, не дает мне никакой подсказки.

Весь скрипт bash был о добавлении модулей на сервер

MODULEPATH=/app/modules/0/modulefiles:/env/common/modules
export MODULEPATH
module() { eval `/app/modules/0/bin/modulecmd sh "$@"` ;} 

Я уже изменил первые две команды на tcsh

setenv MODULEPATH /app/modules/0/modulefiles:/env/common/modules
set MODULEPATH

Но я не знаю, как изменить синтаксис последней команды. Консоль возвращает мне ошибку «Плохо размещены ()».

Могу ли я попросить небольшой урок, что нужно изменить в этой команде, чтобы она была удобнее для tcsh?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Команда module, которую вы хотите перенести с bash на tcsh, уже поставляется с файлом инициализации в оболочке tcsh. Для всех оболочек или языков сценариев, с которыми совместим module, в каталоге init программного обеспечения имеется файл инициализации.

Итак, из вашего примера, модули установлены в /app/modules/0, поэтому у вас должен быть каталог /app/modules/0/init и скрипт /app/modules/0/init/tcsh для инициализации команды модуля для tcsh. Вы просто должны получить его для инициализации команды module:

source /app/modules/0/init/tcsh

Как говорит Армали, команда модуля в tcsh определяется командой оболочки alias.

В последней версии модулей (версия 4+) у вас также есть возможность определить команду module в текущем сеансе оболочки с помощью подкоманды autoinit сценария modulecmd:

eval `/app/modules/0/bin/modulecmd tcsh autoinit`
0 голосов
/ 05 апреля 2019

chepner прав, говоря: tcsh не имеет функций вообще и вам придется вместо этого писать псевдоним. Это не так уж сложно для вашей однострочной функции :

alias module 'eval `/app/modules/0/bin/modulecmd sh \!*`'

В основном мы добавляем alias, удаляем () и {}, заключаем в кавычки и заменяем "$@" на \!*.

...