Kabuk betiğimin dosya işleme sağlamlığını nasıl test edebilirim?


11

Bazı "normal" dosya adlarını işleyen bir kabuk komut dosyası yazdım, ama okudum Neden kabuk komut dosyam boşluk veya diğer özel karakterlerde boğuluyor? Ve neden ls çıktısını ayrıştırmamak gerekir ve ben daha sağlam olmasını ve geçerli dosya adlarını (ve / veya dizin adlarını) işlemesini istiyorum. Scriptimi çalıştırmak için nasıl bir dosya ve dizin test yatağı oluşturabilirim?

Yanıtlar:


11

Oynamak için ayrı bir dizin oluşturun (esas olarak daha sonra temizleme kolaylığı için); $TMPDIRayarlanmışsa değerini kullanır , aksi takdirde /tmp:

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

Boşluk (boşluk, sekme, yeni satır, satır başı, geri dönüş) nedeniyle ayrı ancak birbirine benzeyen dosyalar oluşturun:

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

Yukarıdakiler için Patrick'e teşekkür ederiz . İki altıgen kodlu olanlar, somun ve koyun eti olarak bilinen UTF-8 boşluk ayırıcılarıdır ; "çift yönlü bağlamda Beyaz Boşluk görevi görür ve yansıtılmaz. Glif (ler), koşullar altında 20 başka glifle karıştırılabilir."

Düz bir dosya ve glob olarak ele alınırsa ilk dosyaya genişleyecek bir dosya oluşturun:

touch -- x '[x]' 

Yukarıdakiler için Wumpus Q. Wumbley'e teşekkür ederiz .

Benzer damar içinde:

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

Yukarıdaki yorumlar için buradaki yorumlarda dave_thompson_085'e teşekkür ederiz .

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

Yukarıdaki için godlygeek için kredi .

Kabuk bağlamında değerlendirilirse, farklı bir şeye genişleyecek bir dosya adı (ve muhtemelen keyfi yürütme!):

touch '$( echo boom )'

kullanın:

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

tırnaklardan kaçmadan tırnak içine bir dosya adı koyma girişimlerini yakalamak için.

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

Yukarıdakiler için Stéphane Chazelas'a teşekkür ederiz .

Adlandırılmış bir kanal ve sembolik bağlantı oluşturun ("normal" olmayan dosyalar oluşturmak için):

mkfifo fifo
ln -s a alink

Adlarında çeşitli boşluk bulunan ve içindeki belirteç dosyalarıyla birlikte alt dizinler oluşturun:

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

Dosya adları sadece içeren oluşturun *, (kaldır muhtemelen sorunlu) sadece (düzenli!) Alanı, ölü sembolik bağlantı, sembolik bağlantı oluşan bir dosya adı olduğunu kendi üzerine döngüler ve üst dizine bir bağlantı sırtı bir alt dizin:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Daha fazla çeşitli dosya adı. Son ikisi "kesirli eğik çizgi" ve "bölmeli eğik çizgi" için unicode'dur.

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

Scott'tan fikirler :

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

Bazı bölgelerde zararsız, ancak diğerlerinde tehlikeli karakterler:

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

Bazı yerel ayarlarda aynı sıralama yapan karakterler:

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

.[!.]* *Glob'tan kaçan dosyalar (bazen hem gizli hem de gizli olmayan dosyaları genişletmek için kullanılır):

touch ..foo ...

"yorum" yorumunun ironisi dikkat dağıtıcı; çeşitli komutların ne yaptığına ilişkin açıklamalar mı eklemeyi düşünüyorsunuz?
Jeff Schaller

1
Evet, lütfen en çok oluşturduğunuz test durumlarını açıklayın, bazıları Unicode karakterine benzeyen, öyle değil.
muru

1
Ben ekliyorum a?bve a*b(tabii ki alıntı). @muru: bayt dizileri E2 80 82/83, U + 2002 EN SPACE ve U + 2003 EM
SPACE'in

Orada işte bazı kötü dahiler: -c
user207673

Komut dosyası gereksinimlerine bağlı olarak oynamak ilginç olabilir -ve --yine de bunlara liderlik etmeden erişmek imkansız olabilir ./. Ve ben olmayan glob kabuk özel karakterlerle kadar az olduğunu şaşırdım, gibi ;, &, |, <, >, $, (, ), {, }, =, \, !, ve #- örneğin, {a,b}.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.