Bash脚本从命令行成功运行,但在程序调用时则不会

时间:2013-06-24 12:59:22

标签: bash file-permissions

我有一个脚本“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.5f\n", GF ) } ' DATA1 > "ext.goal1"

要点:

脚本在命令行运行正常,程序调用时脚本在aptbatch.sh停止(但在这种情况下工作正常,没有aptbatch.sh调用)。 aptbatch.sh的路径在.bashrc中,当使用在运行失败期间产生的aptplot1.gr运行“aptbatch.sh -batch aptplot1.gr -nosafe -hardcopy”时,它运行正常。

想法?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

on un * x(与例如w32相反),当前路径通常搜索程序。 只搜索PATH变量中的那些路径。

首先,尝试为您的脚本提供搜索路径。它不需要是绝对的,相对会做得很好。以下将在当前目录中运行脚本(由./表示)

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

如果您的脚本位于其他位置,则可能是您的PATH变量对于交互式shell以及作为脚本运行时的不同。

尝试运行

  echo $PATH

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