在 osascript 中传入 "do shell script" 时找不到已定义的 bash 命令

Defined bash commands not found when passed in "do shell script" in osascript

我是 shell 脚本的新手,最近写了一个脚本来打开一个新的终端 window 和 运行 通过 osascript 使用“do shell 脚本”定义的函数,但结果显示找不到命令。我的脚本如下:

#!/bin/bash

hello() {
    echo "Hello World"
}

openNewWindowAndRun() {
    osascript -e "
        tell application \"Terminal\"
            activate        
            do script \"\"
        end tell
    "
}

openNewWindowAndRun hello

我也试过在 openNewWindowAndRun 中直接调用 hello 函数但是没有成功:

#!/bin/bash

hello() {
    echo "Hello World"
}

openNewWindowAndRun() {
    osascript -e "
        tell application \"Terminal\"
            activate        
            do script \"hello\"
        end tell
    "
}

openNewWindowAndRun

当我 运行 脚本时,它成功打开了新的 window 但显示错误消息:

有谁知道这里遗漏了哪一部分?是否可以将定义的函数作为参数传递给 osascript?如果有人能帮助我,那就太好了!

如果函数 hello() 定义在 .bashrc.bash_profile.zshrc 中(取决于您是哪个 shell使用)。

这里的问题是,当您调用 osascript 创建一个新终端时,新创建的终端不知道名为 hello.[=19 的函数(或命令) =]

因此,您必须以每个新创建的终端都知道该命令的方式定义它。因此,您可以将它放在 .bashrc 中,或者您可以在 $PATH 中创建一个名为 hello 的 shell 脚本,然后将所需的代码放入该脚本中。

您可以尝试以下方法,虽然不完美,但可以避免更改 .bashrc 或 .zshrc 等初始化文件:

#!/bin/bash

hello() {
    echo "Hello $@"
}

openNewWindowAndRun() {
    local  dirname="$(dirname  "$BASH_SOURCE")"
    local basename="$(basename "$BASH_SOURCE")"
    osascript -e "
        tell application \"Terminal\"
            activate        
            do script \"cd '$PWD'; clear; '$dirname/$basename' $*\"
        end tell
    " > /dev/null
}

${@:-openNewWindowAndRun hello World}

运行 与:./test.sh