2012-04-20 36 views
6

Tôi tự hỏi làm thế nào các đối số được gán cho một hàm trong bash có thể được chuyển tiếp "đúng" tới một hàm hoặc chương trình khác. Ví dụ, trong Mac OS X có một chương trình dòng lệnh open (man page) sẽ mở tệp được chỉ định bằng ứng dụng mặc định của nó (tức là nó sẽ mở tệp * .h trong Xcode hoặc một thư mục trong Trình tìm kiếm, v.v.) Tôi chỉ muốn gọi open mà không có đối số để mở thư mục làm việc hiện tại trong Trình tìm kiếm hoặc cung cấp cho nó các đối số tiêu biểu để sử dụng nó bình thường.Làm thế nào để một đối số hàm "chuyển tiếp" đúng trong bash?

Tôi nghĩ, "Tôi sẽ chỉ sử dụng một chức năng!" Hah, không nhanh thế, tôi cho là vậy. Đây là những gì tôi đã có:

function open 
{ 
    if [ $# -eq 0 ]; then 
     /usr/bin/open . 
    else 
     /usr/bin/open "$*" 
    fi 
} 

Đơn giản chỉ cần gọi open hoạt động tuyệt vời, nó sẽ mở ra thư mục làm việc trong Finder. Gọi open myheader.h hoạt động tuyệt vời, nó sẽ mở "myheader.h" trong Xcode.

Tuy nhiên, gọi open -a /Applications/TextMate.app myheader.h để thử mở tệp trong TextMate thay vì Xcode dẫn đến lỗi "Không thể tìm thấy ứng dụng có tên '/Applications/TextMate.app myheader.h'". Dường như việc đi qua "$*" đến /usr/bin/open đang khiến toàn bộ danh sách đối số của tôi được chuyển tiếp chỉ là một đối số thay thế.

Thay đổi chức năng để chỉ sử dụng usr/bin/open $* (không trích dẫn) gây ra sự cố trong đường dẫn có dấu cách. Gọi open other\ header.h sau đó dẫn đến lỗi "Các tệp/Người dùng/thanh tra-g/khác và /Users/inspector-g/header.h không tồn tại", nhưng giải quyết được vấn đề khác.

Phải có một số quy ước cho các đối số chuyển tiếp mà tôi chỉ bỏ lỡ.

Trả lời

9

Bạn thực sự đã bỏ lỡ "[email protected]", được thiết kế cho trường hợp này.

+0

Làm việc như một say mê, cảm ơn bạn nhiều. Chỉ có rất nhiều trong số đó là '$' vars! –

+0

Thực tế '$ *' hoạt động khi bạn phải chuyển tiếp các đối số bên trong một chuỗi (ví dụ: 'mosel -s -c" exec $ * "') –

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