tcsh:foreach命令在终端中工作正常,但在从tcsh脚本文件调用时不起作用

时间:2013-12-16 17:41:54

标签: shell foreach tcsh

对于问题的缩减版,请先阅读下面的Update1。

我已经创建了一个tcsh文件,将文件夹中的所有文件/文件夹列表保存到文件中(我正在进行神经影像学项目,而我正在使用包含多个主题的文件夹RawData)每个都有一个文件夹;我已经写了这个文件genSubjList.tcsh来保存文件subjList.txt的主题列表。文件中的代码是:

foreach subj (*)
    echo $subj >> subjList.txt
end

当我更改为Terminal中的RawData目录并在Terminal中编写这段代码时,它会生成主题列表而没有任何问题,但是当我使用source命令调用genSubjList.tcsh时:

source ../scripts/genSubjList.tcsh

它只是将RawData中第一个文件夹(主题)的名称写入subjList.txt;我已经使用chmode + x来生成genSubjList.tcsh可执行文件(“scripts”文件夹位于RawData的父文件夹中并包含genSubjList.tcsh)

我在终端内部运行代码时的输出是文件subjList.txt,其中包含:

subject1 subject2 subject3 。 。 。 主题n

使用source ../scripts/genSubjLits.tcsh运行代码时的输出是文件subjList.txt containsig:

subject1

我非常感谢你找出我犯错的地方。谢谢!

关于我为什么要弄清问题是什么的补充说明:

问题不仅在于产生一系列主题;我想理解为什么这个tcsh脚本不起作用,因为主要的问题是我使用FreeSurfer(surfer.nmr.mgh.harvard.edu)来分析一些主题;我想并行分析它们,所以我开发了一些脚本来分割5组中的主题(存储在名为subjList1.txt ... subjList5.txt的5个文件中,每个文件都有多个主题)。然后,我想在5个终端中并行运行以下代码:

foreach subj (`cat subjList1.txt`)
    echo $subj
    recon-all -i $RAW_DATA/$subj/T1/*0001.dcm -subject $subj -all
end

其中subjList1.txt替换为并行终端的subjList2,3等; recon-all系列为每个主题进行分析。同样,当我在终端内运行这段代码时,每个subjList中的所有主题都会被分析,但是当我将相同的代码保存在多个脚本文件(recon1.tcsh .. recon5.tcsh)中并使用它们调用它们时:

source recon1.tcsh

分析每个subjList中的第一个主题。

UPDATE1:

有趣的是,如果这个简单的循环:

foreach i (1 2 3 4 5)
    echo $i
end

存储在文件loop.tcsh中,并使用:

调用
source loop.tcsh

输出将只为1,这意味着它只是通过循环的第一轮。

BASH中不存在同样的问题;如果这个循环:

for i in {1..5} ; do
    echo $i
done

存储在文件loop2.bash中,并使用:

调用
source loop2.bash

它没有任何问题!

UPDATE2:

BASH中不存在这个问题;如果这段代码:

for subj in * ; do
    echo $subj >> subjList.txt
done

存储在genSubjList.bash文件中,使用:

调用
source ../scripts/genSubjList.bash

在bash环境中,它会生成主题列表而没有任何问题!

3 个答案:

答案 0 :(得分:4)

我知道这已经过时了但是我遇到了这个因为我刚才遇到了同样的问题并且我自己解决了这个问题。

我在tcsh foreach脚本中的'end'之后添加了一个空行,它运行正常。在此之前,它只会运行列表中的第一项,然后停止。 Bash脚本对我来说很好,就像原始海报一样。为什么空白线很重要?

答案 1 :(得分:0)

当你从source命令运行它时,考虑你的输出只生成列表中的第一个主题,我会检查是否存在循环问题。因为您不再位于与从终端运行它时相同的目录中,所以该脚本可能不会返回到同一homedir。我会添加一个CD命令作为你的for循环的最后一行,看看是否能解决这个问题。

答案 2 :(得分:0)

嗯...而不是pwd,也许会尝试将整个路径写到您希望脚本从/返回的位置。如果问题是由于没有返回到正确的目录,那么cd pwd将使您保持在同一个位置并且不能解决问题。