Bash 从目录列表中的fits文件中提取信息,但在通过脚本读取cd时遇到问题

Bash 从目录列表中的fits文件中提取信息,但在通过脚本读取cd时遇到问题,bash,unix,terminal,idl-programming-language,Bash,Unix,Terminal,Idl Programming Language,我正在编写一个脚本,需要cd迭代一系列子目录,但我无法让shell提交到cd,更不用说正确执行脚本的其余部分了。我仔细研究过类似的问题,但没有一个能正确回答我——制作函数和寻找脚本都不起作用。我对航站楼还比较陌生,现在我很迷茫 #!/bin/bash . ./exptime.sh #without a #, this yields a segmentation fault function exptime() { #make an array of directories file

我正在编写一个脚本,需要
cd
迭代一系列子目录,但我无法让shell提交到
cd
,更不用说正确执行脚本的其余部分了。我仔细研究过类似的问题,但没有一个能正确回答我——制作函数和寻找脚本都不起作用。我对航站楼还比较陌生,现在我很迷茫

#!/bin/bash
. ./exptime.sh #without a #, this yields a segmentation fault

function exptime() {
   #make an array of directories
   filedir=( $(find ~/Documents/Images -maxdepth 1 -type d) ) 
   alias cdall 'cd ${filedir[*]}' #terminal has trouble recognizing the alias

   for filedirs in ${filedir[*]}
   do
       cdall
       ftlist "fuv.fits[1]" T column=3 rows=1 | grep "[0-9]" |
         awk '{print $2}' > fuv_exptime #recognizes this command but
                   # can't execute properly because it's in the wrong directory
   done

正如在问题的评论中已经提到的,很难猜测脚本应该做什么。无论如何,假设目录更改部分是唯一的问题,我会尝试用以下方式修复脚本:

#!/bin/bash
. ./exptime.sh #without a #, this yields a segmentation fault

function exptime() {
   #make an array of directories
   filedirs=( $(find ~/Documents/Images -maxdepth 1 -type d) )
   scriptdir=$(pwd)

   for filedir in ${filedirs[*]}
   do
       cd $filedir
       ftlist "fuv.fits[1]" T column=3 rows=1 | grep "[0-9]" | \
         awk '{print $2}' > fuv_exptime
       cd $scriptdir 
   done

换句话说,在for循环过程中,去掉“cdall”,并将cd放入每个目录中。在ftlist调用之后,将cd返回到调用脚本的目录中,该脚本保存在变量'scriptdir'中for循环之前。希望这能有所帮助。

如果我正确理解您的意图,这应该可以:

for dname in "$HOME"/Documents/Images/*/; do
    ftlist "$dname/fuv.fits[1]" T column=3 rows=1
done | awk '/[[:digit:]]/ { print $2 }' > fuv_exptime
这将在
~/Documents/Images
的所有子目录上循环,并使用输入文件的完整路径运行
ftlist
命令

输出将进入单个文件
fuv\u exptime
。请注意,grep和awk步骤可以合并到单个awk命令中

如果您希望在每个子目录中都有一个单独的输出文件
fuv_exptime
,请更改为以下内容:

for dname in "$HOME"/Documents/Images/*/; do
    ftlist "$dname/fuv.fits[1]" T column=3 rows=1 |
        awk '/[[:digit:]]/ { print $2 }' > "$dname"/fuv_exptime
done 

${filedir[*]}
扩展到整个数组。如果您的数组是
filedir=(dir1 dir2 dir3)
,则您的别名将成为
cd dir1 dir2 dir3
。您希望该命令做什么?还有一系列其他问题。
别名
缺少
=
;由于缺少引用,您依赖于分词和风险文件路径扩展;
exptime.sh
的内容是什么?总之,您应该描述您试图实现的目标,而不是要求挽救此尝试。我试图使用for循环通过子目录进行cd,但我发现终端语法非常不透明。我没有在别名中包含一个=,因为我在~/.bash_配置文件中设置别名时不需要它。有很多目录需要更改,如何扩展别名以包含所有目录,而无需手动键入所有内容?换行是无意的,只是将代码粘贴到hereexptime的一个工件。sh是脚本的名称。我看到一个建议,源脚本本身,但我不完全确定这意味着什么或如何包括它,它没有任何工作,这有帮助!它正在识别cd,但前提是我删除“函数exptime(){…}”包装。但是终端现在无法识别“ftlist”命令。它来自HeatTools任务列表()。这是我必须要做的吗?在编写脚本之前,您是否尝试过ftlist行?这条临界线在任何情况下都有效吗?请在该命令工作的文件夹中尝试“which ftlist”(很可能是该命令所在的文件夹)或“locate ftlist”。如果所有其他方法都失败了,请询问安装者,在哪里可以找到它。一旦位置被清除,我可以相应地编辑我的解决方案。ftlist在声明“heasoft”后工作。该命令本身位于/usr/local/目录(fullpath/usr/local/heasoft-6.17/x86_64-apple-darwin15.3.0/bin/)中,这是有效的!最终,在声明了正确的环境之后。谢谢,没问题。你自己也明白了很多:)这很管用!它识别cd循环。谢谢。然而,我唯一的不满是终端无法识别ftlist命令——它只是给了我一个“未找到命令”错误。这是我应该做的吗?(ftlist是来自heatools档案heasrc.gsfc.nasa.gov/ftools/caldb/help/heatools.html的命令)@tashton它在您的
路径中吗?这取决于你是如何安装的。如果它不在您的
路径中
,您可以添加它,或者使用完整路径,而不仅仅是
ftlist
。其他人安装了它,因此我不确定他们将它存储在哪里。我如何检查它是否存在,如果不存在,我如何处理它。说真的,再次感谢你的支持help@tashton如果它在您的路径中,
哪个ftlist
会找到它,但是您首先不会遇到“command not found”问题。您可以尝试
定位ftlist
@tashton,因此您必须将
/usr/local/heasoft-6.17/x86\u 64-apple-darwin15.3.0/bin
添加到您的
路径
或使用
/usr/local/heasoft-6.17/x86\u 64-apple-darwin15.3.0/bin/ftlist>调用
ftlist