2010-10-17 1960 views
7

我想通过脚本运行程序。 通常我在shell中键入./program并且程序启动。Linux:在脚本中运行二进制文件

我的剧本是这样的:

#!/bin/sh 
cd /home/user/path_to_the_program/ 
sh program 

失败的话,我认为最后一行了错误...

我知道这是幼稚的问题,但THX很多!

+0

不应该是#!/ bin/sh? – Protostome 2010-10-17 15:36:16

回答

0

这里不需要“sh”。只需将“程序”放在最后一行上即可。

+0

它告诉我:“程序:找不到” – 2010-10-17 15:38:08

+0

啊,程序不在你的$ PATH中。 ./程序将工作。 – Toucan 2010-10-17 15:38:44

+0

好吧,有没有一种方法可以通过脚本运行它,而不必将它放到PATH中? – 2010-10-17 15:39:57

11

如果./program在shell中工作,为什么不在脚本中使用它?

#!/bin/sh 
cd /home/user/path_to_the_program/ 
./program 

sh program推出SH,试图解释program作为shell脚本。很可能它不是一个脚本,而是一些其他可执行文件,这就是它失败的原因。

2

你不需要sh,看起来你没有在你的$PATH程序的路径。

试试这个:

#!/bin/sh 
cd /home/user/path_to_the_program/ 
./program 
+0

如果解释了'sh'的使用会更好。为什么它不适用于'sh'? – Arafangion 2010-10-18 04:32:12

1

这应该是足够了:

/home/user/path_to_the_program/program 

如果不工作,检查以下内容:

  • 可执行位
  • 家当线该程序(如果它是一个脚本)
+0

如果程序依赖于当前目录中的相对路径,那么给出路径可能不起作用。例如,程序可能依赖与程序位于同一目录中的输入文件。 – 2010-10-17 15:58:16

+0

在这种情况下,你是对的。 – 2010-10-17 16:11:19

+0

无论如何完成,完整路径必须来自/某处/ - 如果不在路径上,则通过shebang线(如果不在那里),则必须通过某种方式明确设置。 – Arafangion 2010-10-18 04:30:54

3

当键入

./program 

壳试图根据它如何确定该文件需要被执行以执行该程序。如果它是二进制文件,它将尝试执行入口子程序。如果壳检测到它是一个脚本,例如,通过使用

#!/bin/sh 

#!/bin/awk 

或更一般

#!/path/to/interpreter 

壳会通过文件(和任何提供的参数)作为参数提供给解释器,然后它将执行脚本。如果路径中给出的解释器不存在,那么shell将会出错,并且如果没有找到解释器行,那么shell将假定提供的脚本将自行执行。

甲命令

sh program 

相当于

./program 

当程序的第一行包含

#!/bin/sh 

假定/ bin/sh的是在路径的SH(例如它可能是/ system/bin/sh)。将一个二进制文件传递给sh将导致sh将其视为一个shell脚本,事实并非如此,二进制文件不是可解释的shell(它是纯文本文件)。这就是为什么你不能在这种情况下使用

sh program 

。它也会失败,因为程序是ruby,awk,sed或者其他不是shell脚本的东西。

相关问题