如何引用应用包中打包的shell脚本?

时间:2014-06-11 23:37:05

标签: objective-c xcode bash bundle app-bundle

给出两个脚本

  

foo.sh
  bar.sh

在.app包中的 / Contents / Resources 下复制,其中 foo.sh

  

#!/bin/bash
  。 ./bar.sh
  echo $ 1

得到错误

  

没有这样的文件或目录

在脚本尝试源 bar.sh

的行上

有没有办法相对引用 bar.sh

是否有另一种方法可以在.app?

中捆绑一组bash脚本

2 个答案:

答案 0 :(得分:2)

你能做的是:

  1. 获得完整路径&存储实际运行脚本(您的foo.sh)的目录。见https://stackoverflow.com/a/246128/3701456
  2. 使用1.(或相对于该目录)的目录调用或获取第二个脚本(您的bar.sh)
  3. 简单示例:

    $cat script2
    #! /usr/bin/env bash
    echo "Hello World, this is script2"
    
    $cat script1
    #! /usr/bin/env bash
    echo "Hello World from script 1"
    echo "Full script path: $BASH_SOURCE"
    echo "extracted directory: $(dirname $BASH_SOURCE)"
    echo "running script 2"
    $(dirname $BASH_SOURCE)/script2 && echo "running script 2 successful" || echo "error running script 2"
    echo "sourcing script 2"
    source $(dirname $BASH_SOURCE)/script2 && echo "sourcing script 2 successful" || echo "error sourcing script 2"
    

    测试:

    $ls /tmp/test
    script1  script2
    $pwd
    /home/michael
    $/tmp/test/script1
    Hello World from script 1
    Full script path: /tmp/test/script1
    extracted directory: /tmp/test
    running script 2
    Hello World, this is script2
    running script 2 successful
    sourcing script 2
    Hello World, this is script2
    sourcing script 2 successful
    

    有关详细讨论,请参阅上面的链接...

答案 1 :(得分:0)

还有一个老问题,但要解决最后一部分(反映当前的Apple准则):是的,您绝对应该将所有可执行文件(包括脚本)放置在包的MacOS子文件夹中:

  

MacOS -(必填)包含应用程序的独立可执行代码。通常,此目录仅包含一个二进制文件,其中包含应用程序的主入口点和静态链接的代码。但是,您也可以在该目录中放置其他独立的可执行文件(例如命令行工具)

(来源:Anatomy of a macOS Application Bundle。)

违反这些规则将阻止您成功为Gatekeer(当然还有macOS公证)签署应用程序捆绑包。

第一部分由其他响应适当处理。