Bash脚本从命令行成功运行,但在程序调用时无法运行



我有一个脚本"postprocessing.sh"。该脚本假定用于热液模拟包的数据输出的后处理,该包由名为"npo"的父程序调用。

下面的代码假设在数据文件"MELC.PTF"中找到一个数据向量"CFVALU_10000202",将数据向量写入文件"DATA1",执行一点简单的后处理,最后将结果写入"ext.goal1"。

为此,使用了许多函数(MREAD,写入g0.s0,基本上所有写入aptplot1.gr的函数),这是安装在文件树不同部分的绘图工具的一部分。当使用aptplot1.gr作为输入参数调用aptbatch.sh时,我们会调用此绘图工具。aptbatch.sh的路径保存在".bashrc"-文件.的路径变量中

当通过键入"./postprocessing.sh"或"bash postprocessing"从bash执行下面的脚本时,它会按预期执行。文件DATA1、aptplot1.gr和ext.goal1在当前工作目录中生成,内容正确。

当运行"npo"程序(调用"postprocessing.sh")时,aptplot1.gr会写入文件,但既不会生成"DATA1"也不会生成"ext.goal1"。程序在尝试调用"aptbatch.sh"时会暂停。尝试在不使用"aptbatch.sh"的情况下运行"postprocessing.sh",只需将一组随机变量写入文件即可,因此问题不在于调用后处理脚本。

根据npo的作者的说法,程序应该只发出一个带有脚本名称的系统命令,调用命令shell。

我试着查看相关可执行文件的权限,并将chmod+x应用于任何事情,但没有骰子。有人能想到一个系统变量或权限会导致这种情况吗?

#! /bin/sh
cd ~/Melcor/NordicBWR/MinGoalFct/NordicBWR_05_08
# clean up
rm -f aptplot1* ext.goal1 DATA1*
# write read out commands for data vector to file
echo " MELCOR 0 PTF "MELC.PTF"" > aptplot1.gr
echo " MREAD 0 "CFVALU_10000202" DONE" >> aptplot1.gr
echo " write g0.s0 FILE "./DATA1"" >> aptplot1.gr
# execute file
aptbatch.sh -batch aptplot1.gr -nosafe -hardcopy
# postprocessing of max. data value
awk 'BEGIN {max = 0} {if ($2>max) max=$2} {GF = max-10000} {if (GF<0) GF=10000-max} END {printf("%6.5fn", GF ) } ' DATA1 > "ext.goal1"

摘要:

脚本从命令行运行良好,当程序调用时,脚本会在aptbatch.sh处暂停(但即使在这种情况下,没有aptbatch.sh调用,也能正常工作)。aptbatch.sh的路径在.bashrc中,当使用失败运行期间生成的aptplot1.gr运行"aptbatch.sh-batch aptplot1.sr-nosafe-hardcopy"时,它可以正常工作。

想法?

根据@John3136的建议,尝试将aptbatch.sh的完整路径,例如/home/scripts/aptbatch.sh,而不仅仅是名称。如果它不在执行脚本的任何shell的$PATH中,就找不到它。

在un*x上(与例如w32相反),当前路径通常是而不是搜索程序。仅搜索CCD_ 4变量中的那些路径。

因此,作为第一步,尝试为脚本提供一个搜索路径。它不需要是绝对的,相对的会做得很好。以下将在当前目录中运行脚本(如./所示)

 ./aptbatch.sh -batch aptplot1.gr -nosafe -hardcopy

如果您的脚本在其他地方,则可能是交互式shell的PATH变量与作为脚本运行时的PATH变量不同。ö

尝试运行

  echo $PATH

在脚本和cmdline中,查看它们是否不同。(可能在脚本中执行echo $PATH >> /tmp/debug.txt,因此您可以在脚本执行后检查文件/tmp/debug.txt

最新更新