3

给定两个脚本

foo.sh
bar.sh

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

#!/bin/bash
. ./bar.sh
回声 $1

得到一个错误

没有这样的文件或目录

在脚本尝试获取bar.sh的行上

有没有办法相对参考bar.sh

是否有另一种方法可以在 .app 中捆绑一组 bash 脚本?

4

2 回答 2

2

你可以做的是:

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

简单示例:

$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

有关更多详细讨论,请参见上面的链接...

于 2014-06-12T07:27:51.680 回答
0

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

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

(来源:macOS 应用程序包剖析。)

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

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

于 2019-07-04T12:51:13.177 回答