Bash 从GUI中双击执行时,shell脚本中出现意外结果
我已经在我的mac上创建了一个shell脚本,我想通过双击它的图标最终启动它。该脚本获取文件的当前工作目录,查找特定文件夹名称,然后打开到我公司服务器上匹配文件夹的afp连接 从我的终端执行时,脚本将成功激发。以下是IP地址替换为“X”s的脚本: 正如我所说,当从我的终端使用Bash 从GUI中双击执行时,shell脚本中出现意外结果,bash,shell,Bash,Shell,我已经在我的mac上创建了一个shell脚本,我想通过双击它的图标最终启动它。该脚本获取文件的当前工作目录,查找特定文件夹名称,然后打开到我公司服务器上匹配文件夹的afp连接 从我的终端执行时,脚本将成功激发。以下是IP地址替换为“X”s的脚本: 正如我所说,当从我的终端使用/openOnServer.sh命令时,这会成功触发,但当我使文件可执行并修改其属性以打开带有终端的shell时,clientCode变量不再填充 我还尝试将当前的工作目录写入变量,然后echo-ing将其输出。同样,当我从
/openOnServer.sh
命令时,这会成功触发,但当我使文件可执行并修改其属性以打开带有终端的shell时,clientCode
变量不再填充
我还尝试将当前的工作目录写入变量,然后echo
-ing将其输出。同样,当我从终端启动它时,它会工作,但当从图标双击执行脚本时,它不会工作
有没有办法通过双击来实现这一点?我没有mac电脑,但这听起来与从cron运行程序时的常见问题类似。特别是,您的环境变量完全不同(但对脚本操作有很大影响)。我猜当通过GUI启动时,您的
路径
是不同的
尝试在脚本中设置PATH
,可以使用冒号分隔的列表,也可以在mac上使用getconf
:
#!/bin/sh
PATH=$(/usr/bin/getconf PATH) # Assigns system default PATH.
# rest of script
另一个想法是:避免分叉命令,只使用shell获取第四个PWD组件
IFS=/
set -- "$PWD"
open "afp://XXX.XXX.XXX.XXX/Storage/Clients/$4"
如果失败,您需要通过检查stdout和stderr来确切地知道失败的原因。你可以用这个
exec >/tmp/stdout 2>/tmp/stderr
在脚本的顶部。通过GUI运行。看看/tmp/std{out,err}
。有什么线索吗?我猜想PWD
在GUI中是不同的,您甚至没有第三个组件,因为脚本运行在沙箱目录中,比如说/tmp/guiexec.XXXX
当您说“当前工作目录”时,您是指脚本所在的目录吗
如果是,请更改
clientCode=$(pwd | awk 'BEGIN { FS = "/" } ; { print $4 }')
到
我假设您想要的是目录的姓氏,例如“/foo/bar/baz/qux/openOnServer.sh”,您想要的是“clientCode=qux”
另一个裂缝:
dir=$(cd -- "$(dirname "$0")" && pwd -P)
clientCode=$(basename "$dir")
好主意我遵循您的逻辑,发现命令
/usr/bin/getconf PATH
在我的mac上确实有效。我尝试将您提供的文本添加到我的shell中,但它仍然无法从图标dclick中运行。按照您的逻辑,我尝试给出每个命令的完整路径clientCode=$(/bin/pwd |/usr/local/bin/awk'BEGIN{FS=“/”};{print$4}')
,但这与dclick也没有区别:/我发现了一些附加信息。我将变量声明更改为clientCode=$(/bin/pwd)
(这与我之前尝试的唯一区别是包含完整路径)。然后我尝试从完整路径执行,它告诉我当前的工作目录实际上是我主文件夹的根目录。它一定发生了,因为当双击发生时,它在一个从我家发射的子外壳(可能?)中执行。是否有一种方法可以使用shell脚本的pwd
结果,而不会在子shell中触发,即不$(/bin/pwd)
?否,在$()
中分叉的程序在同一目录中运行。但是从GUI启动的程序的工作目录可能与您期望的不同。你希望4美元到底是多少?用户名?应该是文件夹名。我解释得很清楚,对;如果您想知道GUI在哪个目录中启动脚本,请添加echo$PWD>/tmp/PWD
,或者更好的是,使用set>/tmp/environment
检查整个环境。也许你会在其他变量中找到你需要的。是的,我所有的客户端文件所在的目录是/Volumes/Secure/XXX/
,其中XXX
是客户端代码。我希望能够将此shell脚本放在某个客户机代码文件夹中某个子文件夹的任意位置,以便在双击该文件时打开存储服务器上的匹配文件夹。我需要抓取的就是3级目录名的代码。另外,我尝试了clientCode=$(basename“$(dirname“$0”)”
,它返回了
,这似乎是正确的,它表示当前目录,但没有给出目录名。双击图标时,$0中有什么?你能确定吗?啊,当我echo
或说变量$0
时,它会显示/openCurrentClientFolderOnServer.sh
,这是我的shell脚本的名称。就像它只给出了相对路径,而不是完整路径一样/
clientCode=$(basename "$(dirname "$0")")
dir=$(cd -- "$(dirname "$0")" && pwd -P)
clientCode=$(basename "$dir")