让bash在x秒后停止运行 所以我有一个Applescript:

让bash在x秒后停止运行 所以我有一个Applescript:,bash,location,applescript,Bash,Location,Applescript,其中是一个bash脚本,可以使用-f命令获取用户的纬度和经度以及其他统计信息 问题 现在,在第一次运行时,程序请求获得用户位置的权限。如果用户按下“OK”,则一切正常。但是如果用户按下“取消”,我们就有问题了 正如我在《超级用户》上所描述的,LocateMe似乎继续在后台运行,直到位置服务重新打开。同时,我的Applescript会一直挂起,直到bash脚本完成加载,或者直到我强制退出应用程序(或者脚本编辑器,不管我在什么地方运行它)。显然,这不是一个令人满意的行为 更糟糕的是,一旦应用程序请求

其中是一个bash脚本,可以使用
-f
命令获取用户的纬度和经度以及其他统计信息

问题 现在,在第一次运行时,程序请求获得用户位置的权限。如果用户按下“OK”,则一切正常。但是如果用户按下“取消”,我们就有问题了

正如我在《超级用户》上所描述的,LocateMe似乎继续在后台运行,直到位置服务重新打开。同时,我的Applescript会一直挂起,直到bash脚本完成加载,或者直到我强制退出应用程序(或者脚本编辑器,不管我在什么地方运行它)。显然,这不是一个令人满意的行为

更糟糕的是,一旦应用程序请求位置服务许可,它就再也不会请求了;用户必须手动转到“系统首选项”并自己(或)勾选该框。这意味着在第二次运行该脚本时,用户完全无法知道脚本挂起的原因

我处理这个问题的第一次尝试是在
try
语句中填充LocateMe,但是,根据我上面的结论,这不会起任何作用;由于LocateMe将继续运行,直到它能够访问用户的位置,因此Applescript永远不会到达出错时的

我的问题
我想知道是否有一种方法可以在某种语句中调用LocateMe,无论是Applescript还是bash脚本,或者可以在Applescript中运行的其他语言,都可以设置时间限制;如果未达到时间限制,LocateMe将被终止,Applescript将向用户显示一条错误消息,说明必须打开定位服务。

这可能与

如果有可用的超时,只需运行
timeout-k 10 Contents/Resources/LocateMe
(其中10是超时前的秒数)

否则,要么直接调用expect命令,将$command替换为
Contents/Resources/LocateMe
,要么将该函数复制到.bashrc中,以便函数超时在bash中可用,然后调用该函数


expect的例子是定义一个bash函数——当你调用带有参数的函数时,它们被放入名为
$1
$2
等的变量中。因此对于
超时10foo
$1
将是
10
,而
$2
将是
foo
。如果你将它“原样”复制到
中,你就可以可以使用与上面建议的
timeout
命令相同的方法使用它。或者,只需将expect行从函数中复制到脚本中,并用硬编码的值(时间、命令等)替换所有变量.

可能重复@match它看起来很有希望。在实践中,我将如何实现它?如果您有可用的
timeout
,只需运行
timeout-k 10/path/to/LocateMe
(其中10是超时前的秒数。否则,可以直接调用
expect
命令,将
$command
替换为LocateMe,或者将该函数复制到
.bashrc
中,以便函数
timeout
在bash中可用,然后调用该函数。@match听起来不错。是否将所有这些都发布为一个答案?为什么要经历这么多繁琐的事情呢?下面的代码行将替换所有的代码,让您使用
do shell script
命令:
set LocateMe to quoted form of(POSIX path of(path to me as string)和“Contents/Resources/LocateMe”)
-然后您可以使用
将cmdArg设置为“-f\”{LAT},{LON
-接着是
设置LatLon以执行shell脚本LocateMe&space&cmdArg
-然后
将lat设置为LatLon的单词1
将lon设置为LatLon的单词2
-这5行代码将替换您显示的23行代码。:)好的,我显然没有得到什么东西,因为这不起作用。我应该将
.command
文件保存在与
LocateMe
可执行文件相同的文件夹中,然后将文件路径设置到该文件夹,最后使用
do shell脚本运行
timeout
bash,并从
时间调用
LocateMe
out
?也就是说,在OP的评论中使用user3439894的代码,但是在
timeout.sh
中为
LocateMe
在第一行中使用sub,并适当修改第3行?每当我尝试调用该脚本时,我总是会被拒绝访问,如果可以避免的话,我宁愿不
sudo
我的方式来完成它。我想你知道ht误解了
.bashrc
文件的用途以及bash函数的工作原理。您应该仔细阅读这些文件以了解这里发生了什么。这并不直接重要,但我也认为您尝试运行的任何脚本都需要
执行
权限。对于我打算使用此应用程序执行的操作,我宁愿称之为整个脚本在脚本本身中,而不是将命令粘贴到
.bashrc
中。我是否可以说
使用管理员权限执行shell脚本[filename]用户名“user”密码“pass”
?因为这显然不起作用。
on run{}
    set myPath to path to me as text
    set x to the length of myPath
    set myPath to characters 13 thru x of myPath as string --Removes "Macintosh HD:" from the front of the file path
    set myPath to my fileAdapt(myPath)
    set lat to do shell script myPath & " -f \"{LAT}\"" --See comments below the script
    set lon to do shell script myPath & " -f \"{LON}\""
end run

on fileAdapt(myPath)
    set x to the length of myPath
    set myPath1 to ""
    repeat with i from 1 to x
        if character i of myPath is ":" then
            set myPath1 to myPath1 & "/"
        else if character i of myPath is " " then
            set myPath1 to myPath1 & "\\ "
        else
            set myPath1 to myPath1 & (character i of myPath)
        end if
    end repeat
    set myPath1 to myPath1 & "Contents/Resources/LocateMe" as string --See comments below the script
    return myPath1
end fileAdapt