2013-06-06 39 views
8

Tôi đang cố gắng làm cho tập lệnh này hoạt động. Đó là tập lệnh Bash có nghĩa là lấy một số biến, đặt chúng lại với nhau và sử dụng kết quả để gửi lệnh AppleScript. Dán nhãn theo cách thủ công chuỗi được lặp lại từ biến to_osa phía sau osascript -e đối với thiết bị đầu cuối hoạt động như tôi muốn và mong đợi. Nhưng khi tôi cố gắng kết hợp lệnh osascript -e và chuỗi to_osa, nó không hoạt động. Làm thế nào tôi có thể thực hiện công việc này?Kết hợp các biến trong Bash để tạo thành một lệnh được gửi tới AppleScript bằng lệnh osascript

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
delimiter="'" 
to_osa=${delimiter}${the_script}${the_url}${delimiter} 
echo ${to_osa} 
osascript -e ${to_osa} 

Ngoài làm việc bằng tay kịch bản cũng hoạt động khi tôi viết lệnh mong muốn một kịch bản và sau đó thực hiện nó:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh 
sh ~/Desktop/outputfile.sh 

Trả lời

2

Theo nguyên tắc chung, không đặt hai dấu ngoặc kép trong biến, đặt chúng xung quanh biến. Trong trường hợp này, nó phức tạp hơn, vì bạn có một số trích dẫn kép cho trích dẫn cấp bash và một số trích dẫn cho mức trích dẫn của AppleScript; trong trường hợp này, có dấu ngoặc kép AppleScript cấp đi trong biến, có dấu ngoặc kép bash cấp đi xung quanh biến:

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
osascript -e "${the_script}${the_url}" 

BTW, sử dụng echo để kiểm tra mọi thứ như thế này là rất sai lầm. echo đang cho bạn biết những gì trong biến, không phải những gì sẽ được thực thi khi bạn tham chiếu biến trên dòng lệnh. Sự khác biệt lớn nhất là echo in các đối số của nó sau họ đã được thông qua phân tích cú pháp (trích dẫn và loại bỏ thoát, vv), nhưng khi bạn nói "Dán thủ công chuỗi ... hoạt động" bạn đang nói đó là những gì bạn muốn trước khi phân tích cú pháp. Nếu dấu ngoặc kép có trong chuỗi lặp lại, điều đó có nghĩa là bash không nhận ra chúng là dấu ngoặc kép và loại bỏ chúng. So sánh:

string='"quoted string"' 
echo $string   # prints the string with double-quotes around it because bash doesnt't recognize them in a variable 
echo "quoted string" # prints *without* quotes because bash recognizes and removes them 
11

Mã thực thi mashing là lỗi dễ bị và ác, và hoàn toàn không cần nó ở đây. Đó là tầm thường để vượt qua đối số cho một AppleScript bằng cách định nghĩa một rõ ràng 'chạy' xử lý:

on run argv -- argv is a list of strings 
    -- do stuff here 
end run 

mà bạn sau đó gọi như vậy:

osascript -e /path/to/script arg1 arg2 ... 

BTW, nếu kịch bản của bạn đòi hỏi một số cố định của args, bạn cũng viết nó như thế này:

on run {arg1, arg2, ...} -- each arg is a string 
    -- do stuff here 
end run 

...

hơn thế nữa, bạn thậm chí có thể làm cho Apple Script thực thi trực tiếp như bạn làm với bất kỳ kịch bản lệnh shell nào khác. Đầu tiên, thêm một hashbang như sau:

#!/usr/bin/osascript 

on run argv 
    -- do stuff here 
end run 

sau đó lưu nó trong định dạng văn bản uncompiled đồng bằng và chạy chmod +x /path/to/myscript để làm cho các tập tin thực thi. Sau đó bạn có thể thực hiện nó từ vỏ như sau:

/path/to/myscript arg1 arg2 ... 

Hoặc, nếu bạn không muốn chỉ định đường dẫn đầy đủ mọi thời gian, đặt các tập tin trong /usr/local/bin hoặc một số thư mục khác đó là trên PATH của shell của bạn:

myscript arg1 arg2 ... 

...

Vì vậy, dưới đây là cách bạn nên viết kịch bản ban đầu của bạn:

#!/bin/sh 
the_url="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash" 
osascript -e 'on run {theURL}' -e 'tell application "Safari" to set URL of document 1 to theURL' -e 'end run' $the_url 

nhanh, đơn giản và rất mạnh mẽ.

-

p.s. Nếu bạn muốn mở một URL trong một cửa sổ mới thay vì một URL hiện có, hãy xem manpage dành cho công cụ open của OS X.

+0

tại sao the_url trở thành URL mặc dù? –

+1

Môi trường sống; đặt tên nó là bất cứ điều gì bạn thích. – foo

+1

Và điều gì sẽ xảy ra nếu một người muốn Apple srcipt làm kịch bản lệnh shell phụ thuộc vào các biến? Ví dụ. osascript -e 'làm shell script \ "echo $ the_url \"'. – lef