我无法理解我的代码是如何工作的。我是这个项目的新手,以前从未学过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
,并分配12345
给LIST
变量。我确实HOLD ON 12345
在命令提示符中看到了。让我困惑的是,我认为run.sh
先运行,然后调用,那么当该分配不在not时,makeInputAX.sh
如何PDF
分配给?list.txt
makeInputAX.sh
run.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
命令中却没有。