【问题标题】:Linux: Run a binary in a scriptLinux:在脚本中运行二进制文件
【发布时间】:2011-04-26 14:47:06
【问题描述】:

我想通过脚本运行一个程序。 通常我在 shell 中输入./program 并启动程序。

我的脚本如下所示:

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

它失败了,我认为最后一行出错了......

我知道这是个幼稚的问题,但非常感谢!

【问题讨论】:

    标签: linux shell cd sh


    【解决方案1】:

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

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

    sh program 启动 sh 以尝试将 program 解释为 shell 脚本。很可能它不是脚本,而是其他一些可执行文件,这就是它失败的原因。

    【讨论】:

    • 这行得通,但我不明白为什么它会这样工作,但如果我以. /home/user/path_to_program/program 运行它,则会出现错误
    • @VibhanshuBiswas 可能您的部分脚本依赖于当前工作目录,即脚本所在的目录。
    【解决方案2】:

    当你输入时

    ./program
    

    shell 会根据它确定需要执行的文件的方式来尝试执行程序。如果它是二进制文件,它将尝试执行入口子程序。如果 shell 检测到它是一个脚本,例如通过使用

    #!/bin/sh
    

    #!/bin/awk
    

    或更一般地

    #!/path/to/interpreter
    

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

    一个命令

    sh program
    

    等价于

    ./program
    

    当程序第一行包含时

    #!/bin/sh
    

    假设 /bin/sh 是路径中的 sh(例如,它可能是 /system/bin/sh)。将二进制文件传递给 sh 将导致 sh 将其视为 shell 脚本,但事实并非如此,并且二进制文件不是可解释的 shell(它是纯文本)。这就是为什么你不能使用

    sh program
    

    在这种情况下。由于程序是 ruby​​、awk、sed 或其他任何不是 shell 脚本的程序,它也会失败。

    【讨论】:

      【解决方案3】:

      您不需要sh,而且您的$PATH 中似乎没有该程序的路径。

      试试这个:

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

      【讨论】:

      • 如果解释一下'sh'的使用会更好。为什么它不能与“sh”一起使用?
      【解决方案4】:

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

      【讨论】:

      • 它告诉我:“程序:未找到”
      • 好的,有没有办法通过脚本运行它而不把它放到 PATH 中?
      • 是的。在目录中使用“./program”一次,或写出完整路径,例如“/home/user/path_to_the_program/program”。确保程序是可执行的(为此使用 chmod。)
      • 请解释为什么 sh 是不必要的。
      【解决方案5】:

      这就够了:

      /home/user/path_to_the_program/program
      

      如果这不起作用,请检查以下内容:

      • 可执行位
      • 程序的shebang行(如果是脚本)

      【讨论】:

      • 如果程序依赖于其当前目录的相对路径,则提供路径可能不起作用。例如,程序可能依赖于与程序位于同一目录中的输入文件。
      • 不管如何完成,完整路径必须来自 /somewhere/ - 如果不在路径上,则通过 shebang 行,如果不存在,则必须通过一些显式设置意思是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多