2015-01-07 15 views
7

Hãy tưởng tượng rằng trên máy chủ của tôi, tôi có các tập tin sau đây:Bash kịch bản và regex vấn đề

[email protected]:/var/log/foo$ ls 
fooFile1 fooFile2 logFile logFile.1 logFile.2 

Tôi muốn tạo ra một kho lưu trữ có chứa tất cả các tập tin nhưng logfile *.. Vì vậy, tôi đã đưa ra lệnh:

[email protected]:~$ tar -czf foo.tar.gz /var/log/foo/!(logFile.*)

Và nó hoạt động tốt! Tuy nhiên, khi cố gắng để tạo ra một kịch bản mà không được công việc như nhau:

#!/bin/bash 

tar -czf foo.tar.gz /var/log/foo/!(logFile.*) 

Tôi đã xem qua các lỗi sau:

./test.sh: line 3: syntax error near unexpected token '(' 
./test.sh: line 3: 'tar -czf foo.tar.gz /var/log/foo/!(logFile.*)' 

Vấn đề không tar liên quan (Tôi đã gặp vấn đề tương tự sử dụng ls thay của tar)

Tôi không hiểu lỗi này đến từ đâu. Bất cứ ai có thể cho tôi biết nơi tôi sai?

Met trên Ubuntu 12.04

Trả lời

7

Nơi dòng này ngay dưới công việc:

shopt -s extglob 

bật tùy chọn glob mở rộng trong kịch bản của bạn.

!(logFile.*) là mở rộng mô hình glob mà đòi hỏi phải tạo điều kiện cho extglob

+4

Đó là giá trị chỉ ra một cách rõ ràng rằng tùy chọn này được kích hoạt theo mặc định trong một vỏ tương tác, đó là nguyên nhân của sự khác biệt trong hành vi. –

+1

Tôi sẽ cần phải tìm hiểu thêm về nó. Cám ơn hai bạn ! –

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