2014-07-11 13 views
7

Có thể bỏ qua các đối số tùy chọn không xác định bằng GNU getopt không?GNU getopt của Linux: bỏ qua các đối số tùy chọn không xác định?

Tôi có một tập lệnh, scriptA.sh, có đối số tùy chọn --optA, --optB, --optC, --optD.

Tôi muốn viết trình bao bọc, wrapperA, với hai đối số tùy chọn, --optX and --optY, gọi số scriptA. Tuy nhiên, tôi không muốn khai báo tất cả các tham số tùy chọn của scriptA bên trong trình bao bọc.

Đặc biệt, nếu bên wrapperA, tôi chỉ định đối số tùy chọn với

getopt --longoptions optX:,optY: 

cuộc gọi

wrapperA --optX --optA --optB 

trả về một lỗi

getopt: unknown option -- optA 

GNU getopt có thể bị buộc phải bỏ qua chưa biết đối số và đặt chúng sau '-' trong đầu ra của nó?

Trả lời

5

Không thể cho GNU getopt bỏ qua các tùy chọn không xác định. Nếu bạn thực sự muốn tính năng đó, bạn sẽ phải viết trình phân tích cú pháp tùy chọn của riêng bạn.

Không đơn giản như chỉ bỏ qua các tùy chọn không xác định. Làm thế nào bạn có thể cho biết liệu một tùy chọn không xác định có một đối số hay không?

Ví dụ sử dụng kịch bản gốc:

originalscript --mode foo source 

đây foo là một lập luận để lựa chọn --mode. trong khi source là "tham số không tùy chọn" (đôi khi được gọi là "thông số vị trí").

Ví dụ sử dụng kịch bản wrapper:

wrapperscript --with template --mode foo source 

Làm thế nào có thể getopt trong wrapperscript biết rằng nó nên bỏ qua --mode cùng với foo? Nếu chỉ bỏ qua --mode thì originalscript sẽ nhận được foo làm thông số vị trí đầu tiên.

Cách giải quyết có thể là thông báo cho người dùng về tập lệnh trình bao bọc của bạn để viết tất cả các tùy chọn dành cho tập lệnh gốc sau một dấu gạch ngang kép (--). Theo quy ước, dấu gạch ngang kép đánh dấu kết thúc các tùy chọn. GNU getopt nhận ra dấu gạch ngang kép và dừng phân tích và trả về phần còn lại dưới dạng tham số vị trí.

Xem thêm:

+0

Cảm ơn bạn đã trả lời của bạn.Dấu gạch ngang kép để chấm dứt danh sách tùy chọn sẽ hoạt động trong trường hợp của tôi. Đối với bỏ qua các tùy chọn không xác định, tôi thấy quan điểm của bạn - nó không phải là dễ dàng như nó trông. Ý tưởng ban đầu của tôi là đẩy tất cả các tùy chọn không xác định phía sau - trong đầu ra getopt (--với nguồn foo mẫu - chế độ). Tuy nhiên, điều này sẽ chỉ hoạt động nếu xử lý thông số tiếp theo được chuyển sang bản gốc. Như bạn đã nói, hàm wrapperscript không có cách nào để biết các tham số của bản gốc có tham số hay không. – user3830744

+0

Đã xảy ra sự cố tương tự, dấu gạch ngang kép hoạt động như một sự quyến rũ. –

2

tôi đã làm việc trên một điều tương tự, và thấy điều này làm việc để ngăn chặn các lỗi getopt từ bugging tôi với các lỗi này. Về cơ bản chỉ là ống lỗi để lãng quên.

while getopts "i:s:" opt > /dev/null 2>&1; do 
    case $opt in 
     i) 
     END=$OPTARG 
     ;; 
    esac 
done 
./innerscript $* 

$ ./blah.sh -s 20.140.503 -i 3 -a -b -c

+0

** Điều này sẽ bị ngắt nếu đối số còn thiếu mất 'OPTARG' **. https://gist.github.com/cirosantilli/2a803442add75e0f1e164cde183999d3 GNU Bash 4.3.48. –

+0

Điều này cũng vi phạm nếu (các) tùy chọn không hợp lệ được (được) thông qua * trước * các giá trị hợp lệ. – trysis

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