ฉันจะทดสอบความทนทานในการจัดการไฟล์เชลล์สคริปต์ได้อย่างไร


11

ฉันเขียนเชลล์สคริปต์ที่จัดการชื่อไฟล์ "ปกติ" บางตัว แต่ฉันอ่านแล้วทำไมเชลล์สคริปต์ของฉันถึงสำลักในช่องว่างหรืออักขระพิเศษอื่น ๆ และทำไมคุณไม่ควรแยกวิเคราะห์ผลลัพธ์ของ lsและฉันต้องการให้มันมีประสิทธิภาพมากกว่าและจัดการชื่อไฟล์ที่ถูกต้อง (และ / หรือชื่อไดเรกทอรี) ฉันจะสร้างไฟล์ทดสอบและไดเรกทอรีเพื่อเรียกใช้สคริปต์ของฉันได้อย่างไร

คำตอบ:


11

สร้างไดเรกทอรีแยกต่างหากเพื่อเล่น (เพื่อความสะดวกในการทำความสะอาดในภายหลังส่วนใหญ่); สิ่งนี้จะใช้ค่าเป็น$TMPDIRถ้าตั้งค่าไว้มิฉะนั้น/tmp:

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

สร้างไฟล์ที่แยกจากกัน แต่มีลักษณะคล้ายกันเนื่องจากช่องว่าง (ช่องว่างแท็บขึ้นบรรทัดใหม่ carriage return, backspace):

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

สินเชื่อเพื่อที่อยู่ด้านบนเพื่อแพทริค รหัสเลขฐานสิบหกสองอันคือตัวคั่นช่องว่าง UTF-8 ที่รู้จักในชื่อnutและmutton ; "ในบริบทแบบสองทิศทางมันทำหน้าที่เป็นพื้นที่สีขาวและ (ไม่) เป็นมิเรอร์สัญลักษณ์ (s) สามารถภายใต้สถานการณ์จะสับสนกับอีก 20 ร่ายมนตร์"

สร้างไฟล์ธรรมดาและไฟล์ที่จะขยายเป็นไฟล์แรกหากไฟล์นั้นถูกถือว่าเป็นไฟล์ glob:

touch -- x '[x]' 

สินเชื่อเพื่อที่อยู่ข้างต้นเพื่อWumpus Q. Wumbley

ในหลอดเลือดดำที่คล้ายกัน:

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

เครดิตสำหรับด้านบนเพื่อdave_thompson_085ในความคิดเห็นที่นี่

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

สินเชื่อเพื่อที่อยู่ด้านบนเพื่อgodlygeek

ชื่อไฟล์ที่จะขยายไปสู่บางสิ่งที่แตกต่าง (และอาจมีการดำเนินการโดยพลการ!) หากประเมินในบริบทเชลล์:

touch '$( echo boom )'

ใช้:

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

เพื่อพยายามพยายามใส่ชื่อไฟล์ในเครื่องหมายคำพูดโดยไม่ต้องใส่เครื่องหมายคำพูด

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

สินเชื่อเพื่อที่อยู่ด้านบนเพื่อStéphane Chazelas

สร้างไพพ์ที่มีชื่อและ symlink (เพื่อสร้างไฟล์ที่ไม่ "ปกติ"):

mkfifo fifo
ln -s a alink

สร้างไดเรกทอรีย่อยที่มีช่องว่างต่าง ๆ รวมอยู่ในชื่อของพวกเขาพร้อมกับไฟล์โทเค็นภายในพวกเขา:

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

สร้างชื่อไฟล์ที่มี*(อาจเป็นปัญหาในการลบ), ชื่อไฟล์ประกอบด้วยพื้นที่ (ปกติ!), ลิงก์สัญลักษณ์ตาย, ลิงก์สัญลักษณ์ที่วนซ้ำไปมาเองและไดเรกทอรีย่อยที่มีลิงค์กลับไปยังไดเรกทอรีหลัก:

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

ln -s /does/not/exist dead

ln -s loop loop

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

ชื่อไฟล์อื่น ๆ อีกมากมาย สองอันสุดท้ายเป็นยูนิโค้ดสำหรับ "เศษส่วนเฉือน" และ "กองทับ"

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

ไอเดียจากScott :

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

ตัวละครที่ไม่เป็นอันตรายในบางพื้นที่ แต่เป็นอันตรายในที่อื่น ๆ :

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

อักขระที่เรียงลำดับเดียวกันในบางโลแคล:

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

ไฟล์ที่หลบหนี.[!.]* *glob (บางครั้งใช้เพื่อขยายไฟล์ที่ซ่อนและไม่ซ่อน):

touch ..foo ...

ประชดของความคิดเห็น "ความคิดเห็น" ที่ทำให้เสียสมาธิ คุณกำลังพูดเพื่อเพิ่มคำอธิบายสำหรับสิ่งที่คำสั่งต่างๆกำลังทำอยู่?
Jeff Schaller

1
ใช่โปรดอธิบายกรณีทดสอบที่คุณสร้างให้ชัดเจนที่สุดบางคนชอบแบบที่ดูเหมือนอักขระ Unicode อยู่ในนั้น
muru

1
ฉันจะเพิ่มa?bและa*b(อ้างถึงแน่นอน) @muru: ลำดับไบต์ E2 80 82/83 เป็นการเข้ารหัสแบบ UTF-8 ของ U + 2002 EN SPACE และ U + 2003 EM SPACE
dave_thompson_085

อัจฉริยะที่ชั่วร้ายบางคนทำงานที่นั่น: -c
user207673

มันอาจจะเป็นที่น่าสนใจที่จะเล่นกับ-และแม้จะขึ้นอยู่กับความต้องการของสคริปต์มันอาจจะควรจะเป็นไปไม่ได้ที่จะเข้าถึงได้โดยไม่ต้องชั้นนำ-- ./และฉันประหลาดใจว่ามีไม่กี่ที่ไม่ใช่ตัวอักษร glob เปลือกพิเศษเช่น;, &, |, <, >, $, (, ), {, }, =, \, !และ#- {a,b}ยกตัวอย่างเช่น
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.