do shell script in AppleScript

最近的项目里经常用,所以顺手翻译一下,也增强了解,同样无版权不保证内容正确性,原文地址 

do shell script in AppleScript 


这篇技术要点回答了AppleScript中的do shell script命令中经常被问及的问题,该命令自AppleScript1.8后引入 


文本讲述了一些如何使用do shell script的常见问题,但并不准备向您解释Unix shell script或教您写,这点您可以去找一本合适的Unix教材或咨询身边的专家。文章以问答的形式组织,所以您可以直接跳到您的问题或从头到尾阅读。 


有些回答引用了"man pages";它们是Mac OS X里自带的参考文档。("man"是"manual"的简称) 想看某个命令的man page可以打开终端窗口再输入man 后加上该命令的名字,形如man echo. 


发出命令 


Q:我如何传递一个AppleScript变量到shell命令中 


A:因为do shell script的命令参数实际上就是字符串,所以你只需要用AppleScript里的连接操作符&做拼接就可以了。如例: 

Applescript代码   收藏代码
  1. set hostname to "www.apple.com"  
  2. do shell script "ping -c1 " & hostname  

有些命令只接受标准输入中的数据,AppleScript并不直接支持,但你可以用"echo"配合管道来模拟 

Applescript代码   收藏代码
  1. set input to "hello"  
  2. do shell script "echo " & input & " | tr a-z A-Z"  
  3. -- "HELLO"  

总的来说,您应该用quote form of变量,详见后续的处理文本相关章节 



Q:我的命令在终端里执行的好好的,可为什么用do shell script执行就会报"Command not found"的错误呢?这是怎么回事? 


A:这有两种可能。首先,do shell script永远都是使用/bin/sh来解释您的命令而非终端使用的默认shell,(查看您的默认shell到底是什么,可以在终端里输入 echo $SHELL 
,Mac OS X使用的一般是/bin/bash).因为有的命令使用的是同样的程序,有的命令则不同,而您可能正好使用了那些不同的。如果您想现在终端里试试do shell script的正确性,就永远使用sh,启动sh只需要键入 /bin/sh 
,键入 exit 
就是退出sh返回您的默认shell 

其次,如果您只是单纯的输入命令名而非完整路径,shell会使用一系列的目录(也就是您的PATH)去查找该命令的完整路径。处于安全和可移植性的考虑,do shell script忽略了交互式终端可能会读取的配置文件,所以您可能无法使用某些在终端中能使用的命令。为此,您可以使用命令的完整路径,比如 /sbin/ifconfig 
而不是仅仅输入 ifconfig 
.要在终端里找出命令的完整路径,使用 which command-name 
,例如 which ifconfig 
.想看do shell script具体会搜索的路径,在终端里输入 "echo $PATH" 
即可。 

(回答中有些词汇需要深究请继续研读文章的后续部分) 


Q:为什么do shell script不与终端执行的效果完全一致? 


A:有两个原因:第一,这这保证了脚本可以在不做修改的运行在不同的系统上,如果do shell script使用了您的默认shell或路径,您的脚本给别人使用的时候就可能因为这些不同而失败。第二,它要满足shell其他语言的转义机制如Perl。 


Q:我如何使用sh以外的shell来执行命令? 


A:将你想要使用的shell显式的包含在命令里。方法有很多种,你可以把命令写入文件,然后执行文件上的脚本,如 

Applescript代码   收藏代码
  1. do shell script "/bin/tcsh my-command-file-path"  

有的shell把脚本当作参数来接受,如 

Applescript代码   收藏代码
  1. do shell script "/bin/tcsh -c 'my-command'"  

绝大多数shell都接受标准输入的脚本,如 

Applescript代码   收藏代码
  1. do shell script "echo my-command | /bin/tcsh"  


如果还有疑问,请阅读你所偏好的shell的相关文档。如果您在do shell script里输入这些指令,您可能需要像下文所述将指令用引号括起来,否则sh可能会误读。 


Q:我如何在一句do shell script里使用多条指令?比如我想要先cd到某目录,然后在该目录里做一些操作,但是分次调用do shell script不会记住上次的工作路径。 

A:每次对do shell script的调用都是一个新的进程,所以前一次调用里改变的路径无法对下一次调用生效。想要在一次调用中做多个操作,请用分号隔开不同的操作指令,如下 

Applescript代码   收藏代码
  1. do shell script "cd ~/Documents; ls"  
  2. -- result: "Welcome.txt"  


使用换行(ASCII 字符10号)也可以起到同样的效果 


Q:我如何以管理员权限执行某个命令? 

A:如下即可 
Applescript代码   收藏代码
  1. do shell script "command" user name "me" password "mypassword" with administrator privileges  

user name 和password参数都是可选的,如果忽略user name,将默认使用当前用户,如果忽略密码,则运行时会主动询问(译者在AppleScript编辑器的场景下是授权失败)。一旦脚本被成功授权,五分钟内不会再次询问。在MAC OS X 10.4系统上,这段恩惠时光不能延续到其他脚本上;对sudo手动添加-k参数也是没有必要的。 

出于安全的考虑,你可能不想在调用别的应用程序时仍然使用管理员权限,那么将命令写在所有的tell块之外或者写在tell me块之中。 



Bear in mind that administrator privileges allow you to change any file anywhere in the system. You can render your system unbootable or even erase the entire disk with a few well-placed commands, so exercise caution. Better yet, don’t use administrator privileges unless you absolutely have to. Unless you are doing system-level development, you should never need to change anything in /System — changing /Library should suffice. 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值