Làm cách nào để kiểm tra độ mạnh xử lý tệp của tập lệnh shell của tôi?


11

Tôi đã viết một tập lệnh shell xử lý một số tên tệp "thông thường", nhưng tôi đã đọc Tại sao tập lệnh shell của tôi bị nghẹt trong khoảng trắng hoặc các ký tự đặc biệt khác? Tại sao bạn không nên phân tích đầu ra của ls và tôi muốn nó mạnh hơn và xử lý bất kỳ tên tệp hợp lệ nào (và / hoặc tên thư mục). Làm cách nào tôi có thể tạo một giường thử nghiệm của các tệp và thư mục để chạy tập lệnh của mình?

Câu trả lời:


11

Tạo một thư mục riêng để chơi (để dễ dàng dọn dẹp sau này, chủ yếu); cái này sử dụng giá trị $TMPDIRnếu nó được đặt, nếu không /tmp:

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

Tạo các tệp riêng biệt, nhưng xuất hiện tương tự nhau vì khoảng trắng (khoảng trắng, tab, dòng mới, trả về vận chuyển, khoảng lùi):

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

Tín dụng cho những điều trên cho Patrick . Hai mã hex là các dấu tách không gian UTF-8 được gọi là nutmutton ; "trong bối cảnh hai chiều, nó hoạt động như Không gian trắng và (không) được nhân đôi. Các glyph (s) có thể, trong các trường hợp, có thể bị nhầm lẫn với 20 glyphs khác."

Tạo một tệp đơn giản và một tệp sẽ mở rộng thành tệp đầu tiên nếu nó được coi là toàn cục:

touch -- x '[x]' 

Tín dụng cho những điều trên cho Wumpus Q. Wumbley .

Trong một tĩnh mạch tương tự:

touch -- 'a?b' 'a*b'

Tín dụng cho những điều trên cho dave_thndry_085 trong các ý kiến ​​ở đây.

touch -- foo\`echo\ malicious\`bar

Tín dụng cho những điều trên cho godlygeek .

Một tên tệp sẽ mở rộng sang một cái gì đó khác (và có khả năng thực thi tùy ý!) Nếu được đánh giá trong ngữ cảnh shell:

touch '$( echo boom )'

Sử dụng:

touch -- single\'quote double\"quote back\\slash

để bắt những nỗ lực đặt tên tệp trong dấu ngoặc kép mà không thoát dấu ngoặc kép.

touch -- -a -b -c -r -R - a=x

Tín dụng cho những điều trên cho Stéphane Chazelas .

Tạo một đường ống và symlink có tên (để tạo các tệp không "thường xuyên"):

mkfifo fifo
ln -s a alink

Tạo các thư mục con có nhiều khoảng trắng khác nhau được bao gồm trong tên của chúng, cùng với các tệp mã thông báo bên trong chúng:

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

Tạo tên tệp chỉ chứa *(có thể có vấn đề cần xóa), tên tệp chỉ bao gồm một khoảng trắng (thông thường!), Liên kết tượng trưng chết, liên kết tượng trưng lặp lại trên chính nó và thư mục con có liên kết trở lại thư mục mẹ:

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

Tên tập tin linh tinh hơn. Hai cái cuối cùng là unicode cho "slash phân đoạn" và "slash chia".

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

Ý tưởng từ Scott :

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

Các nhân vật vô hại ở một số địa phương nhưng nguy hiểm ở những người khác:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

Các ký tự sắp xếp giống nhau ở một số địa phương:

touch   # sorts the same in GNU locales, order non-deterministic.

Các tệp thoát khỏi toàn .[!.]* *cầu (đôi khi được sử dụng để mở rộng cả các tệp bị ẩn và không bị ẩn):

touch ..foo ...

sự mỉa mai của một bình luận "bình luận" là gây mất tập trung; bạn đang nói để thêm giải thích cho những gì các lệnh khác nhau đang làm?
Jeff Schaller

1
vâng, vui lòng mô tả các trường hợp thử nghiệm mà bạn tạo ra hầu hết là rõ ràng, một số trường hợp giống như một ký tự Unicode trong đó, thì không.
muru

1
Tôi muốn thêm a?ba*b(trích dẫn tất nhiên). @muru: chuỗi byte E2 80 82/83 là mã hóa UTF-8 của U + 2002 EN SPACE và U + 2003 EM SPACE
dave_thedom_085

Một số thiên tài độc ác tại nơi làm việc ở đó: -c
user207673

Nó có thể thú vị để chơi với ---, mặc dù, tùy thuộc vào yêu cầu của kịch bản, có thể không thể truy cập chúng mà không có người dẫn đầu ./. Và tôi ngạc nhiên rằng có quá ít với những người không-glob nhân vật vỏ đặc biệt, như ;, &, |, <, >, $, (, ), {, }, =, \, !, và #- ví dụ, {a,b}.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.