स्ट्रिंग्स कमांड क्यों नहीं रुकेगा?


30

stringsआदेश बर्ताव अजीब तरह से, जाहिरा तौर पर यह लिखित एक फाइल करने के लिए बंद नहीं होता, भले ही ड्राइव और स्थान शेष नहीं। या शायद मुझे कुछ याद आ रहा है?

मैं निम्नलिखित चलाता हूं:

# strings /dev/urandom > random.txt

यह चालू था और डिस्क भरने के बाद भी बंद नहीं हुआ (एक नियमित USB फ्लैश)।

फिर तेज होने के लिए मैंने एक रैमडिस्क बनाया और फिर से उसी कमांड को आजमाया। यह भी बंद नहीं हुआ।

मैं समझता हूं कि urandomएक नियमित फ़ाइल नहीं है और stringsआउटपुट भी पुनर्निर्देशित है, हालांकि ऊपर के दोनों मामलों में, catकमांड ने त्रुटि की रिपोर्ट की जब कोई अधिक स्थान नहीं था।

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. क्या यह स्ट्रिंग्स का सामान्य व्यवहार है? यदि हां, तो क्यों?
  2. कोई और जगह नहीं छोड़े जाने के बाद डेटा कहाँ लिखा है?

1
क्या संकेत था कि आपकी पहली कमांड ने वास्तव में डिस्क को भर दिया था?
Kusalananda

1
@ कुसलानंद यह df द्वारा रिपोर्ट किया गया था। मैं इसे एक अन्य वर्चुअल टर्मिनल से देख रहा था, जिसका उपयोग df -h
user174174

2
@ कुसलानंद: आप इसका आसानी से परीक्षण कर सकते हैंstrace strings /dev/urandom > /dev/full
पीटर

2
@mosvy OpenBSD stringsGNU बिनुटिल से उसी कार्यान्वयन का उपयोग करता है । मैं straceकमांड की बात कर रहा था ।
Kusalananda

2
@ कुसलानंद ओके, क्योंकि स्ट्रिंग्स के "बीएसडी टूलचैन" प्रतिस्थापन (1) पुटचर के वापसी मूल्य के लिए जांच नहीं करता है () या तो
मारी

जवाबों:


63

यदि जीएनयू catयह नहीं पढ़ सकता है कि वह क्या पढ़ता है, तो यह एक त्रुटि के साथ बाहर निकल जाएगा :

/* Write this block out.  */

{
  /* The following is ok, since we know that 0 < n_read.  */
  size_t n = n_read;
  if (full_write (STDOUT_FILENO, buf, n) != n)
    die (EXIT_FAILURE, errno, _("write error"));
}

stringsदूसरी ओर, GNU , परवाह नहीं करता है कि क्या यह सफलतापूर्वक लिखने में कामयाब है:

while (1)
  {
    c = get_char (stream, &address, &magiccount, &magic);
    if (c == EOF)
      break;
    if (! STRING_ISGRAPHIC (c))
      {
        unget_part_char (c, &address, &magiccount, &magic);
        break;
      }
    putchar (c);
  }

इसलिए वे सभी लिखते हैं, लेकिन असफलता stringsसाथ-साथ जारी रहती है, जब तक कि यह इनपुट के अंत तक नहीं पहुंच जाता है, जो कभी नहीं होगा।

$ strace -e write strings /dev/urandom > foo/bar
write(1, "7[\\Z\n]juKw\nl [1\nTc9g\n0&}x(x\n/y^7"..., 4096) = 4096
write(1, "\nXaki%\ndHB0\n?5:Q\n6bX-\np!E[\n'&=7\n"..., 4096) = 4096
write(1, "%M6s\n=4C.%\n&7)n\nQ_%J\ncT+\";\nK*<%\n"..., 4096) = 4096
write(1, "&d<\nj~g0\nm]=o\na=^0\n%s]2W\nM7C%\nUK"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "~\nd3qQ\n^^u1#\na#5\\\n^=\t\"b\n*91_\n ]o"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "L\n6QO1x\na,yE\nk>\",@Z\nyM.ur\n~z\tF\nr"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\n61]R\nyg9C\nfLVu\n<Ez:\n.tV-c\nw_'>e"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nCj)a\nT]X:uA\n_KH\"B\nRfQ4G\n3re\t\n&s"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "j\nk7@%\n9E?^N\nJ#8V\n*]i,\nXDxh?\nr_1"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "ia\tI\nQ)Zw\nnV0J\nE3-W \n@0-N2v\nK{15"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nZ~*g\n)FQn\nUY:G\ndRbN\nn..F\nvF{,\n+"..., 4096) = -1 ENOSPC (No space left on device)
...

19
अच्छा विश्लेषण। मैं कहूंगा कि इसे एक बग माना जाना चाहिए strings
कास्पर्ड

3
बग की रिपोर्ट करने की योजना बना रहा है?
नैट एल्ड्रेडज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.