2011-08-06 31 views
12

Tôi đang gặp sự cố với một tập lệnh shell sử dụng một phần nhỏ của Applescript. Khi tôi biên dịch nó với trình soạn thảo Applescript nó hoạt động. Nó không mặc dù trong một kịch bản shell.lỗi osascript/cú pháp: Dự kiến ​​cuối dòng nhưng tìm thấy tên lệnh. (-2741)

44:49: syntax error: Expected end of line but found command name. (-2741) 23:28: syntax error: Expected end of line but found “after”. (-2741)

Đây là mã shell:

osascript -e 'tell application "System Events" -e 'activate' 

osascript -e 'tell process "Application 10.5" -e 'set frontmost to true' -e 'end tell' 

osascript -e 'delay 1' -e 'keystroke return' -e 'delay 1' -e 'keystroke return' 

end tell 

AppleScript (làm việc):

tell application "System Events" 
activate 
tell process "Application 10.5" 
    set frontmost to true 
end tell 

delay 1 
keystroke return 
delay 1 
keystroke return 

end tell 

[cập nhật]/[giải quyết]

này đã chăm sóc bất kỳ loại vấn đề nào tôi đã cố gắng sửa đổi bản ghi chép để hoạt động trong địa ngục kịch bản:

## shell script code 

echo "shell script code" 
echo "shell script code" 

## applescript code 

osascript <<EOF 
tell application "Scriptable Text Editor" 
    make new window 
    activate 
    set contents of window 1 to "Hello World!" & return 
end tell 
EOF 

## resume shell script... 

Nó rất mát mẻ mà bạn có thể đặt AppleScript tinh khiết trực tiếp vào một kịch bản shell. ;-)

Trả lời

1

Thay vì sử dụng cờ-e, bạn chỉ có thể lưu trữ mã AppleScript của bạn trong một tập tin văn bản nhỏ và gọi

osascript /path/to/script 

Ngoài ra, nếu bạn đang nói với một ứng dụng hoặc quá trình làm chỉ một điều, bạn có thể viết như sau:

tell process "MyProcess" to perform action. 

Bây giờ tôi nghĩ về nó, chạy từng dòng riêng biệt với cờ -e có thể sẽ không hoạt động vì tôi không nghĩ rằng tất cả các dòng sẽ kết nối và chạy như một chương trình. Ví dụ, tôi chỉ cần thử nghiệm bằng cách sử dụng osascript -e để thiết lập một biến. Sau đó tôi sử dụng một osascript -e riêng để đọc biến, và nó không thể.

[*]

+1

Cảm ơn bạn đã giải thích. Tôi thực sự đã tìm ra một cách tuyệt vời để đưa bản ghi trực tiếp vào kịch bản lệnh shell mà không phải trải qua tất cả công việc sửa đổi nó để hoạt động. (xem ở trên) - –

5

Mỗi osascript (1) lệnh là quá trình hoàn toàn tách biệt, và do đó một kịch bản hoàn toàn riêng biệt, vì vậy bạn không thể sử dụng trạng thái (ví dụ như biến) giữa chúng. Bạn có thể tạo tập lệnh nhiều dòng trong osascript bằng nhiều tùy chọn -e - tất cả đều được ghép nối với các ngắt dòng giữa chúng để tạo thành tập lệnh. Đối với một kịch bản đủ dài, một tệp riêng biệt hoặc một "tài liệu ở đây", như bạn đã sử dụng trong giải pháp cuối cùng của bạn, là một cách tốt để đi.

Ngoài ra, nếu kịch bản của bạn là chủ yếu (! Hoặc hoàn toàn) AppleScript, bạn có thể thực hiện một “vỏ” kịch bản mà chỉ đơn giản là AppleScript sử dụng một tập tin công việc mà gọi osascript:

#!/usr/bin/osascript 
display dialog "hello world" 

... và sau đó sử dụng do shell script nếu cần.

Các vấn đề liên quan