在我的 Solaris Illumos 中,我运行了一个简单的脚本:
update_drv -a -i '[myhardware]' [driver]
svcadm disable stmf
svccfg import /mypath/myconfig
svcadm enable stmf
它不起作用,也没有给我任何错误。服务 stmf 进入维护模式,我必须重新启动!
我发现,如果我从控制台运行单个命令,它就可以工作,但如果我将它放入脚本中,它只运行第一行。
你能解释一下这种行为吗?
答案1
如果第一行与您在此处显示的完全一样,并且您正在从不同于运行脚本的目录的控制台执行该行,那么最可能的解释是脚本目录中有一个文件,其文件名为一个字符,即“driver”中的字符之一。
shell 将其[driver]
视为潜在的 glob,并尝试将其与目录中的文件名进行匹配。如果找到匹配的文件名,它会用该名称替换 glob。例如,运行的结果命令可能如下所示:
update_drv -a -i '[myhardware]' d
这可能会产生意想不到的后果。
为了防止这种情况,请将最后一个参数放在引号内,就像前一个参数一样。
然而,我怀疑你括号里的字符串只是占位符,你省略了可能有助于提出潜在解决方案的信息。顺便说一句,Oracle 文档似乎表明无论如何都可能需要重新启动。
为了排除脚本故障,请set -x
在顶部附近添加,以便查看跟踪。您还可以echo "here"
在第一行(或任何一行)后添加一行,以查看脚本是否成功。您没有收到任何错误消息,这真的很奇怪。
另一种可能性是二进制文件损坏或硬件损坏,但由于它在命令行上运行,因此这种情况似乎不太可能。
另一个可能主要的考虑因素是控制台会话和脚本之间的环境不同。您没有说明您是从命令行还是通过 运行脚本cron
。在这种情况下,通常是不同或某些环境变量设置不同或未设置。诊断这种情况的一种方法是在脚本中PATH
添加一个命令,如在命令行和两个文件中添加命令,并查找显着差异。您是否以不同的用户身份运行脚本和控制台命令?这也会产生影响。set > script_env.out
set > cons_env.out
diff