代码之家  ›  专栏  ›  技术社区  ›  Jason R. Mick

递归grep真的更好吗?;如何改进基于PBS的bash脚本?;以及其他问题

  •  1
  • Jason R. Mick  · 技术社区  · 14 年前

    我在一个研究小组工作,我们使用PBS排队系统。我不是PBS主管,但我想编写一个搜索脚本,寻找是否有工作正在运行。为此,我首先使用qstat调用的结果作为qstat-f的参数获取所有作业的字符串,然后获取所有作业的详细列表并搜索提交的文件路径。当前的kludge如下

    dump=`qstat -f `qstat``
    if grep -q \
              "/${compounds[$i]}/D0_${j}_z_$((k*30))/scripts/jobscript_minim" \
          <<<$dump; then
          echo "Minimize is running!"
    fi
    

    改进建议?

    另外,我听说()比``干净。但当我尝试:

    dump="$(qstat -f "$(qstat)")"
    

    …我的程序失败了。为什么会这样?我是否误解了如何用$()嵌套shell调用?或者它与我如何将队列作业列表从qstat传递到qstat-f有关?我应该使用awk或者其他什么工具从qstat命令中获取作业,然后以某种方式将它们作为参数传递给qstat-f吗?

    我还应该使用递归grep吗?有人告诉我它“更理智”,但我不确定这意味着什么。它更轻便吗?速度快吗?去看心理医生需要更少的时间吗?

    你应该使用它的原因是什么?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Jason R. Mick    14 年前

    好吧…设法想出一个干净的解决方案…

    search_dir="${compounds[${i}]}/D0_${j}_z_$[30*k]"
    if [ ! -z "$(qstat -f $(qstat | grep -F jmick | awk '{print $1}')|\
          grep -F "$search_dir"|head -n 1)" ]
          then
    

    …因为我要搜索的目录有点长,所以我把它赋给一个变量。我运行内部命令替换以仅获取具有用户名的作业,然后运行外部命令替换以打印这些作业的完整详细信息,然后对目录的这些详细信息进行grep。如果它发现它早,我包括一个头部试图短路的命令。

    然而,递归grep有什么意义的问题仍然存在。

        2
  •  1
  •   Dennis Williamson    14 年前

    递归的 grep 将搜索所有子目录中的多个文件。如果不使用递归,它将只搜索当前(或指定)目录中的一个或多个文件。我看不出一个人怎么会比另一个人更“理智”。它们都有自己的特殊应用。

    顺便说一下,你真的应该把你的问题分成具体的问题,而不是把它们放在一起——即使它们有共同点。当你这样做的时候,这个网站工作得更好。

        3
  •  0
  •   Amber    14 年前

    尝试不带引号:

    dump=$(qstat -f $(qstat))
    
        4
  •  0
  •   Gilles 'SO- stop being evil'    14 年前

    dump=`qstat -f `qstat`` 等于 dump=$(qstat -f )qstat$() 相当于 dump="$(qstat -f)qstat" .

    qstat -f "$(qstat)" 电话 qstat 有两个参数:选项 -f 以及 QSTAT 把一个词集中在一起。 dump="$(qstat -f "$(qstat)")" 集合 dump 输出到外部 QSTAT 命令。

    qstat -f $(qstat) 电话 QSTAT 从1开始的任何参数数目,取决于 QSTAT :首先输出 QSTAT 在每个空白序列处被拆分为单独的单词,然后每个看起来像全局模式的单词(即包含 * , ? [ )与至少一个文件匹配的将替换为匹配文件名列表。所有这些单词和文件名都成为外部 QSTAT .