我正在研究需要特定编译器的各种项目。幸运的是,在我正在处理的机器上,我得到了一个命令module
,这使得交换编译器变得容易,例如。
module unload PrgEnv-intel
module load PrgEnv-cray
,或者
module swap PrgEnv-intel PrgEnv-cray
还有一个命令module list
,它列出了所有当前加载的模块。输出大致是
Currently loaded modules:
1) module_foo/v2.3
2) module_bar/1.1.8
...
17) PrgEnv-pgi/5.2.40
或其他相似之处。 (编译器不一定列在第17位;它只是在该列表的某个位置。)
我的问题:在给定时间可以加载哪些编译器。我想在每个项目的目录中编写一个带有module list
输出的脚本,找到以PrgEnv
开头的列表部分(例如{x}编译器的PrgEnv-xxx
,无论哪个是当前的loading),然后执行命令module swap PrgEnv-xxx PrgEnv-cray
,例如需要cray编译器的项目。
这里的要点是我无法加载cray编译器(比方说),除非我 un 加载当前加载的编译器。我可以通过检查module list
的结果来访问此信息,但我宁愿编写一个自动完成所有这些操作的脚本。
这是疯狂的矫枉过正吗?也许,但我现在也在努力学习如何使用UNIX命令解决更多泛型问题,我认为这将是一个很好的学习经历。
答案 0 :(得分:2)
#!/bin/bash
[ $# = 1 ] || { echo "Usage: $0 PrgEnv-new" >&2; exit 1; }
new_module="${1:?}"
cur_module=$(module list | sed -n '/^[0-9]*) *\(PrgEnv-[a-zA-Z0-9_]*\)\/.*/ s//\1/p')
if [ -z "$cur_module" ]
then module load "$new_module"
else if [ "$cur_module" != "$new_module" ]
then module swap "$cur_module" "$new_module"
else echo "Current module is $cur_module; so is requested module"
fi
它使用标准(史前)sed
符号,并且应该适用于任何版本。 -n
抑制了正常的'echo'操作。该模式查找数字后跟)
和空格PrgEnv-
以及标识符后跟/
和垃圾。它用PrgEnv-
和标识符替换所有内容并打印生成的行。它可能也许应该在此之后退出(将p
更改为{ p; q; }
)。
以下代码测试是否加载了模块。如果没有,它会加载新的。如果新模块与当前模块不同,则将其交换。如果新模块与当前模块相同,则表示如此。
第一行检查脚本是否使用一个参数调用,如果不是则打印用法消息。第二个捕获参数中的值,检查它是否为空(因此有人没有想到并调用switch_env ''
,假设脚本被称为switch_env
)。
答案 1 :(得分:0)
module list | cut -d' ' -f2 | cut -d/ -f1 | grep ^PrgEnv | xargs module unload && module load PrgEnv-cray