2010-08-17 37 views
5

tôi đã kịch bản sau đâyLàm thế nào để vượt qua một biến TỪ TỪ TỪ một kịch bản lệnh shell?

#!/bin/bash 
/usr/bin/osascript << EOT 
set myfile to choose file 
EOT 

no_ext=$(python -c "print '$myfile'.split('.')[0]") 

### this works - just need to know how to pass the arg 
R CMD Sweave no_ext.Rnw 
pdflatex no_ext.tex 
open no_ext.pdf 

thể bất cứ ai chỉ cho tôi "làm thế nào để vượt qua myfile biến một cách chính xác"?

EDIT Thx cho tất cả các đề xuất!

Không biết phải chấp nhận điều gì, tất cả các câu trả lời của bạn thực sự đã giúp tôi vì tôi học được rất nhiều từ mọi người.

+0

lý do tại sao bạn không viết tất cả mọi thứ trong hoặc bash hoặc AppleScript? tại sao sự phức tạp này? – ghostdog74

+0

Đơn giản vì tôi không biết cách sử dụng cửa sổ cửa sổ GUI và lấy đối số của nó (tệp đã chọn) trở lại tập lệnh shell của tôi mà không sử dụng tập lệnh apple. Tôi đã đọc về Cocoadialog, nhưng điều đó sẽ cần thêm công cụ để cài đặt mà không làm việc cho tôi, bởi vì đồng nghiệp cũng nên có thể sử dụng nó. –

Trả lời

5

Những vấn đề sau đây tồn tại trong kịch bản của bạn:

Một tập hợp biến trong phần AppleScript không trở nên được xác định trong kịch bản kèm theo vỏ. Bạn phải thực hiện trao đổi dữ liệu với kịch bản lệnh shell bằng cách sử dụng lệnh thay thế.

AppleScripts được gọi từ tập lệnh trình bao không được phép tương tác người dùng vì chúng không có ngữ cảnh ứng dụng. Bạn có thể sử dụng ứng dụng trợ giúp "AppleScript Runner" để chạy các lệnh tương tác của người dùng.

Đây là một phiên bản sửa đổi của kịch bản của bạn, nơi những vấn đề được cố định:

#!/bin/bash 

myfile=$(/usr/bin/osascript << EOT 
tell app "AppleScript Runner" 
    activate 
    return posix path of (choose file) 
end 
EOT) 

if [ $? -eq 0 ] 
then 
    echo $myfile 
else 
    echo "User canceled" 
fi 
+0

+1 cho lý do. mặc dù tôi đã tấn công theo cách này, sử dụng: mkdir -p foo.app/Contents/MacOS mv foo.sh foo.app/Contents/MacOS/foo chmod + x foo.app/Contents/MacOS/foo –

+0

eh xin lỗi, bạn có thể giải thích $? -eq 0 nếu mệnh đề? cám ơn! –

+0

chấp nhận điều này vì nó gần nhất với những gì tôi đã sử dụng vào cuối –

2

Trước tiên, bạn cần lấy nội dung của biến số myfile từ Bản ghi ứng dụng để bash. Tôi không biết Applescript, vì vậy tôi sẽ thực hiện một shot trong bóng tối như thế nào để viết để sản lượng tiêu chuẩn của nó. Sau đó phần python chỉ là sự phức tạp không cần thiết (và có khả năng là sai, bạn đã vứt bỏ mọi thứ sau khi . đầu tiên chứ không phải là cuối cùng). Tiếp theo, bạn cần $ trước tên biến trong cú pháp bash. Tôi nghĩ rằng kịch bản sau đây làm những gì bạn muốn: (. set -e lúc đầu làm cho lối ra vỏ ngay lập tức nếu một lỗi xảy ra, thay vì cố gắng để thực hiện pdflatex mặc dù không có tập tin .tex đã được sản xuất hoặc somesuch)

#!/bin/sh 
set -e 
myfile=$(osascript <<EOT 
set myfile to choose file 
write myfile to stdout 
EOT 
) 
no_ext="${myfile%.*}" 
R CMD Sweave "$no_ext.Rnw" 
pdflatex "$no_ext.tex" 
open "$no_ext.pdf" 

+0

Điều đó không có tác dụng, đơn giản vì oascript mở hộp thoại không được thực thi. Tôi cần nó để chọn tập tin –

+0

@ ran2: Kịch bản lệnh shell mà tôi đã viết không gọi 'oascript', nhưng bit Applescript có thể sai vì tôi không biết Applescript. Bạn thấy gì nếu bạn thay thế 'set -e' bằng' set -ex' (điều này làm cho shell in ra một dấu vết thực hiện)? – Gilles

+0

nó nói: ++ oascript ./test2: dòng 7: oascript: lệnh không tìm thấy + myfile = –

2

Nhận ra rằng đường dẫn bản ghi chú được phân cách bằng dấu hai chấm ":". Bạn cần dấu gạch chéo được phân tách bằng dấu gạch chéo, vì vậy trong các thuật ngữ cận cảnh, đó là "đường dẫn posix". Ngoài ra, khi sử dụng osascript nó không thể mở cửa sổ hộp thoại. Bạn phải yêu cầu một ứng dụng mở cửa sổ. Tiếp theo, bạn "trả lại" một cái gì đó từ bản thảo ... đó là những gì xảy ra với bash. Cuối cùng, trong bash để thực hiện một lệnh và gán kết quả cho một biến sử dụng `` xung quanh lệnh. Vì vậy, biết đây là một kịch bản lệnh shell để sử dụng một bản ghi chép để có được biến myFile.

#!/bin/bash 

myFile=`/usr/bin/osascript << EOT 
tell application "Finder" 
activate 
set myfile to choose file with prompt "Select the file to use in bash!" 
end tell 
return (posix path of myfile) 
EOT` 

echo $myFile 
+0

Điều này cũng làm việc cho tôi vì tôi đã phá vỡ vấn đề sakra đã đề cập (xem chú thích) –

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