我已经在我的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
- 将其写出来。同样,当我从终端触发它时它可以工作,但是当从图标双击执行脚本时它不起作用。
有没有办法通过双击来实现这一点?
答案 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")