在GUI中双击执行时,shell脚本中出现意外结果

时间:2014-03-05 20:12:15

标签: bash shell

我已经在我的mac上创建了一个shell脚本,我希望最终通过双击它的图标来触发它。该脚本获取文件的当前工作目录,查找特定的文件夹名称,然后打开与我公司的某个服务器上的匹配文件夹的afp连接。

从终端执行时脚本成功触发。这是IP地址替换为“X”的脚本:

#!/bin/bash

clientCode=$(pwd | awk 'BEGIN { FS = "/" } ; { print $4 }')
# echo $clientCode

open afp://XXX.XXX.XXX.XXX/Storage/Clients/$clientCode

正如我所说,当我使用终端的./openOnServer.sh命令时会成功触发,但是当我使文件可执行并修改它的属性以打开带有终端的shell时,clientCode变量不再填充

我还尝试将当前工作目录写入变量并echo - 将其写出来。同样,当我从终端触发它时它可以工作,但是当从图标双击执行脚本时它不起作用。

有没有办法通过双击来实现这一点?

2 个答案:

答案 0 :(得分:0)

我没有mac,但这听起来与从cron运行程序时的常见问题类似。特别是,您的环境变量完全不同(但对脚本操作有很大影响)。我的猜测是,通过GUI启动时PATH是不同的。

尝试在脚本中设置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

答案 1 :(得分:0)

当您说“当前工作目录”时,您的意思是脚本所在的目录吗?

如果是,请更改

clientCode=$(pwd | awk 'BEGIN { FS = "/" } ; { print $4 }')

clientCode=$(basename "$(dirname "$0")")

我假设您想要最后一个目录名称,例如“/foo/bar/baz/qux/openOnServer.sh”,您想要“clientCode = qux”


另一个裂缝:

dir=$(cd -- "$(dirname "$0")" && pwd -P)
clientCode=$(basename "$dir")