使用shell编程和cpp文件进行调试?

使用shell编程和cpp文件进行调试?

我无法理解我的代码是如何工作的。我是这个项目的新手,以前从未学过unix。我的同事很快向我展示了如何运行该程序,但没有解释它是如何工作的

通过运行 make 确保所有 C++ 文件正确编译后,他转到命令提示符并键入./run.sh list.txt

我看了一下run.sh文件。如下:

DIR=/directory/scripts/binaries/what

LIST=$1

while read PDF
do 
    echo "HOLD ON ${PDF}..." 
    ./makeInputAX.sh ${PDF} ${PDF} >INPUT/${PDF}.something 
    ${DIR} -AX INPUT/${PDF}.something # I don't want to reveal the actual types of files I'm dealing with, so I called them 'something'
done < ${LIST}

makeInputAX.sh文件是:

$PDF=1
echo "THEFILE ABC/{PDF}.something"

并且list.txt简单地包含:

12345

所以我已经知道run.sh读取里面的内容list.txt,并分配12345LIST变量。我确实HOLD ON 12345在命令提示符中看到了。让我困惑的是,我认为run.sh先运行,然后调用,那么当该分配不在not时,makeInputAX.sh如何PDF分配给?list.txtmakeInputAX.shrun.sh

同样让我困惑的是,在命令提示符中,我看到了程序的输出,因为它们是写在项目一部分的 cpp 文件中的。但是,这些文件位于单独的目录中,而不是/directory/scripts/binaries/what.我对这些 cpp 文件进行了更改,并希望查看我应该得到的新输出,但出现错误:

 could not open the somethingelse file for read

但是,could not open the ..它没有写在我的 C++ 代码中。要解决这个问题,我是否需要查看我的 cpp 文件,或者这些 sh ​​文件是否有帮助?

答案1

$1是脚本的第一个参数,即list.txt

LIST=$1

只需将该文件名复制到LIST变量中,因此$LIST现在lists.txt也包含 - 它不包含12345.

while read PDF
do
    ...
done < ${LIST}

启动一个循环,其标准输入被重定向到文件list.txt,并且每次通过循环时,它都会从文件中读取一行到变量中PDF。因此$PDF将包含`12345。

中的变量makeInputAX.sh与 中的变量无关run.sh。所以他们每个人都有自己的变量,名为PDF,并且他们独立操作。唯一的例外是环境变量,它是使用export命令声明的;调用脚本中设置的环境变量将复制到它调用的脚本的环境中(但反之则不然)。

我在你的脚本中没有看到任何可能产生“无法打开其他文件进行读取”的内容,它一定来自 C++ 程序。它可能位于您的程序调用的库中,因此您不会在代码中的任何位置看到该消息。

不过,您的makeInputAX.sh脚本看起来不正确。大概应该是这样的:

PDF=1
echo "THEFILE ABC/${PDF}.something"

在另一个命令中插入变量值时,将其放在$变量之前,而不会在赋值中使用它。你把它搞反了,$在作业中使用了,但在echo命令中却没有。

相关内容