मैं अपनी शेल स्क्रिप्ट की फ़ाइल-हैंडलिंग मजबूती का परीक्षण कैसे कर सकता हूं?


11

मैंने एक शेल स्क्रिप्ट लिखी है जो कुछ "नियमित" फ़ाइलनामों को संभालती है, लेकिन मैंने पढ़ा है कि मेरी शेल स्क्रिप्ट व्हॉट्सएप या अन्य विशेष पात्रों पर क्यों चोक करती है? और आप ls के आउटपुट को पार्स क्यों नहीं कर सकते हैं और मैं चाहूंगा कि यह अधिक मजबूत हो और किसी भी मान्य फ़ाइल नाम (और / या निर्देशिका) को संभाल सके। मैं अपनी स्क्रिप्ट चलाने के लिए फ़ाइलों और निर्देशिकाओं का परीक्षण-बिस्तर कैसे बना सकता हूं?

जवाबों:


11

खेलने के लिए एक अलग निर्देशिका बनाएं (बाद में सफाई की आसानी के लिए, मुख्य रूप से); $TMPDIRयदि यह सेट है, तो यह मान का उपयोग करता है , अन्यथा /tmp:

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

ऐसी फाइलें बनाएँ जो अलग हों, लेकिन व्हॉट्सएप (स्पेस, टैब, न्यूलाइन, कैरिज रिटर्न, बैकस्पेस) के कारण एक-दूसरे के समान दिखाई देती हैं:

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 अंतरिक्ष विभाजक हैं जिन्हें अखरोट और मटन के रूप में जाना जाता है ; "द्विदिश संदर्भ में यह व्हाइट स्पेस के रूप में कार्य करता है (हैं) को प्रतिबिंबित नहीं किया जाता है। ग्लिफ़ (एस) परिस्थितियों में, 20 अन्य ग्लिफ़ के साथ भ्रमित हो सकता है।"

एक सादा फ़ाइल बनाएं और एक जिसे पहले एक ग्लोब के रूप में माना गया था, उसका विस्तार होगा:

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

स्टीफन चेज़ेलस को उपरोक्त के लिए श्रेय

एक नामांकित पाइप और सिमिलिंक बनाएं (ऐसी फाइलें बनाने के लिए जो "नियमित" नहीं हैं):

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'

स्कॉट से विचार :

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.

.[!.]* *ग्लोब से बचने वाली फाइलें (कभी-कभी छिपी हुई और गैर-छिपी हुई दोनों फाइलों का विस्तार करने के लिए उपयोग की जाती हैं):

touch ..foo ...

"टिप्पणी" टिप्पणी की विडंबना विचलित करने वाली है; क्या आप विभिन्न आदेशों के लिए स्पष्टीकरण जोड़ने के लिए कह रहे हैं?
जेफ स्कालर

1
हां, कृपया अपने द्वारा बनाए गए परीक्षण मामलों का वर्णन करें, कुछ स्पष्ट हैं, कुछ ऐसे हैं जो इसमें एक यूनिकोड चरित्र की तरह दिखते हैं, वे नहीं हैं।
मुरु

1
मैं जोड़ूंगा a?bऔर a*b(निश्चित रूप से उद्धृत)। @ एमुरु: बाइट सीक्वेंस E2 80 82/83 UTF-8 को U + 2002 EN SPACE और U + 2003 EM SPACE के
एन्कोडिंग हैं

कुछ दुष्ट प्रतिभाएँ वहाँ काम करती हैं: -c
user207673

यह साथ खेलना दिलचस्प हो सकता है -और --, हालांकि, स्क्रिप्ट की आवश्यकताओं के आधार पर, उन्हें अग्रणी के बिना एक्सेस करना असंभव हो सकता है ./। और मैं हैरान हूँ गैर ग्लोब खोल विशेष वर्ण के साथ ऐसा कुछ देखते हैं कि, जैसे ;, &, |, <, >, $, (, ), {, }, =, \, !, और #- उदाहरण के लिए, {a,b}
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.