我使用哪个UNIX实用程序?

时间:2015-04-01 01:45:18

标签: bash unix utility

我正在研究需要特定编译器的各种项目。幸运的是,在我正在处理的机器上,我得到了一个命令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命令解决更多泛型问题,我认为这将是一个很好的学习经历。

2 个答案:

答案 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