【问题标题】:Bash script runs from successfully from command line but not when invoked by programBash脚本从命令行成功运行,但在程序调用时不运行
【发布时间】:2013-06-20 23:56:14
【问题描述】:

我有一个脚本“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”时,它可以正常工作。

想法?

【问题讨论】:

  • 是在同一个目录下运行的吗? (可能不是问题,因为第一行是 CD)。 PATH 很重要,因为它必须在某个地方找到 aptbatch.sh。

标签: bash file-permissions


【解决方案1】:

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

【讨论】:

  • 嗯,这对于我浪费了半个周末的东西来说太简单了。谢谢你们俩。以供将来参考,我可以查找任何环境变量,它会告诉我使用哪个 shell?
【解决方案2】:

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

首先,尝试为您的脚本提供搜索路径。它不需要是绝对的,相对的就可以了。以下将运行 current 目录中的脚本(由./ 表示)

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

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

尝试运行

  echo $PATH

在您的脚本和 cmdline 中,查看它们是否不同。 (可能在脚本中做echo $PATH &gt;&gt; /tmp/debug.txt,所以你可以在脚本执行后检查文件/tmp/debug.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 2019-11-15
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多