Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从GUI中双击执行时,shell脚本中出现意外结果_Bash_Shell - Fatal编程技术网

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

Bash 从GUI中双击执行时,shell脚本中出现意外结果,bash,shell,Bash,Shell,我已经在我的mac上创建了一个shell脚本,我想通过双击它的图标最终启动它。该脚本获取文件的当前工作目录,查找特定文件夹名称,然后打开到我公司服务器上匹配文件夹的afp连接 从我的终端执行时,脚本将成功激发。以下是IP地址替换为“X”s的脚本: 正如我所说,当从我的终端使用/openOnServer.sh命令时,这会成功触发,但当我使文件可执行并修改其属性以打开带有终端的shell时,clientCode变量不再填充 我还尝试将当前的工作目录写入变量,然后echo-ing将其输出。同样,当我从

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

从我的终端执行时,脚本将成功激发。以下是IP地址替换为“X”s的脚本:

正如我所说,当从我的终端使用
/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")