لینکس میں اسٹڈین ، اسٹڈ آؤٹ ، اور اسٹڈیڈر کیا ہیں؟

stdin, stdout، اور stderr جب آپ لینکس کمانڈ لانچ کرتے ہیں تو تین ڈیٹا اسٹریمز تخلیق ہوتے ہیں۔ آپ ان کو استعمال کرنے کے ل tell یہ بتانے کے لئے استعمال کرسکتے ہیں کہ آیا آپ کے اسکرپٹس کو پائپ یا ری ڈائریکٹ کیا جارہا ہے۔ ہم آپ کو کیسے دکھاتے ہیں۔

سلسلے دو پوائنٹس میں شامل ہوتے ہیں

جیسے ہی آپ لینکس اور یونکس جیسے آپریٹنگ سسٹم کے بارے میں جاننا شروع کریں گے ، آپ کو شرائط آ جائیں گی stdin, stdout، اور stederr. یہ تین معیاری دھارے ہیں جو جب لینکس کمانڈ پر عمل درآمد ہوتے ہیں تو قائم ہوجاتے ہیں۔ کمپیوٹنگ میں ، ایک دھارا ایسی چیز ہے جو ڈیٹا کی منتقلی کرسکتی ہے۔ ان اسٹریمز کی صورت میں وہ ڈیٹا ٹیکسٹ ہے۔

پانی کی نہروں کی طرح ڈیٹا اسٹریمز کے بھی دو سرے ہیں۔ ان کا ایک ذریعہ اور اخراج ہے۔ آپ جو بھی لینکس کمانڈ استعمال کررہے ہیں وہ ہر ایک اسٹریم کا ایک سرہ فراہم کرتا ہے۔ دوسرا اختتام اس خول سے ہوتا ہے جس نے کمانڈ شروع کی۔ کمانڈ شروع کرنے والی کمانڈ لائن کے مطابق ، اس کا اختتام ٹرمینل ونڈو سے ، پائپ سے جڑا ہوا ، یا کسی فائل یا کسی دوسرے کمانڈ پر ری ڈائریکٹ ہوگا۔

لینکس معیاری سلسلہ

لینکس میں ،stdin معیاری ان پٹ اسٹریم ہے۔ یہ متن کو اس کے ان پٹ کے طور پر قبول کرتا ہے۔ کمانڈ سے شیل تک ٹیکسٹ آؤٹ پٹ کے ذریعہ پہنچایا جاتا ہے stdout (معیاری باہر) ندی۔ کمانڈ کی طرف سے غلطی کے پیغامات کے ذریعے بھیجے جاتے ہیں stderr (معیاری خامی) ندی۔

تو آپ دیکھ سکتے ہیں کہ دو آؤٹ پٹ اسٹریمز ہیں ، stdout اور stderr، اور ایک ان پٹ اسٹریم ، stdin. چونکہ غلطی کے پیغامات اور معمول کی پیداوار ہر ایک کے پاس ان کو ٹرمینل ونڈو تک لے جانے کے ل own اپنی اپنی نالی ہوتی ہے ، لہذا وہ ایک دوسرے سے آزادانہ طور پر سنبھل سکتے ہیں۔

فائلوں کی طرح اسٹریمز کو سنبھالا جاتا ہے

لینکس میں چلنے والی اسٹریمز everything جیسے ہر چیز کی طرح - اس طرح سلوک کیا جاتا ہے جیسے وہ فائلیں ہوں۔ آپ فائل سے ٹیکسٹ پڑھ سکتے ہیں ، اور آپ فائل میں ٹیکسٹ لکھ سکتے ہیں۔ ان دونوں اعمال میں اعداد و شمار کا ایک سلسلہ شامل ہے۔ تو اعداد و شمار کے ایک اسٹریم کو بطور فائل ہینڈل کرنے کا تصور اتنا زیادہ نہیں ہے۔

عمل سے وابستہ ہر فائل کو شناخت کرنے کے لئے ایک انوکھا نمبر مختص کیا جاتا ہے۔ اسے فائل ڈسریکٹر کے نام سے جانا جاتا ہے۔ جب بھی کسی فائل پر کسی عمل کو انجام دینے کی ضرورت ہوتی ہے تو فائل کی شناخت کے ل file فائل ڈسریکٹر استعمال ہوتا ہے۔

یہ اقدار ہمیشہ استعمال ہوتی ہیں stdin, stdout، اور stderr:

  • 0: stdin
  • 1: stdout
  • 2: stderr

پائپ اور ری ڈائریکٹ پر ردعمل

کسی کے مضمون میں کسی کے تعارف کو کم کرنے کے ل a ، ایک عام تکنیک ہے کہ عنوان کا آسان ورژن پڑھایا جائے۔ مثال کے طور پر ، گرائمر کے ساتھ ، ہمیں بتایا جاتا ہے کہ قاعدہ "I سے پہلے E کے علاوہ ، سی کے بعد سوائے" ہے۔ لیکن اصل میں ، اس اصول کی تعمیل کرنے سے کہیں زیادہ استثناء موجود ہیں۔

اسی طرح کی رگ میں ، جب بات کرتے ہو stdin, stdout، اور stderr قبول شدہ محور کو نکالنا آسان ہے کہ اس عمل کو نہ تو پتہ ہے اور نہ ہی اس کی پرواہ ہے جہاں اس کے تین معیاری سلسلے ختم کردیئے گئے ہیں۔ کیا کسی عمل کی دیکھ بھال کرنی چاہئے کہ آیا اس کا آؤٹ پٹ ٹرمینل میں جا رہا ہے یا فائل میں ری ڈائریکٹ ہو رہا ہے؟ کیا یہ یہ بھی بتا سکتا ہے کہ آیا اس کا ان پٹ کی بورڈ سے آرہا ہے یا کسی اور عمل سے اس میں پائپ لگا رہا ہے؟

دراصل ، ایک عمل جانتا ہے - یا کم سے کم یہ معلوم کرسکتا ہے ، کیا اسے چیک کرنے کا انتخاب کرنا چاہئے — اور اگر اس کے مطابق سافٹ ویئر مصنف نے اس فعالیت کو شامل کرنے کا فیصلہ کیا تو وہ اس کے طرز عمل کو تبدیل کرسکتا ہے۔

ہم رویے میں ہونے والی اس تبدیلی کو بہت آسانی سے دیکھ سکتے ہیں۔ ان دو حکموں کو آزمائیں:

ls

ls | کیٹ

ls اگر اس کی پیداوار (stdout) کو ایک اور کمانڈ میں داخل کیا جا رہا ہے۔ یہ ہےls جو کسی ایک کالم آؤٹ پٹ میں تبدیل ہوتا ہے ، یہ اس کے ذریعہ کی جانے والی تبدیلی نہیں ہے کیٹ. اور ls ایک ہی کام کرتا ہے اگر اس کی آؤٹ پٹ ری ڈائریکٹ ہو رہی ہو:

ls> گرفت.ٹشت

بلی کی گرفت. txt

stdout اور stderr کو ری ڈائریکٹ کرنا

ایک سرشار ندی کے ذریعہ غلطی کے پیغامات پہنچانے کا ایک فائدہ ہے۔ اس کا مطلب ہے کہ ہم کمانڈ کی پیداوار کو ری ڈائریکٹ کرسکتے ہیں (stdout) کسی فائل میں بھیج دیں اور پھر بھی کوئی خرابی والے پیغامات دیکھیں (stderr) ٹرمینل ونڈو میں۔ اگر آپ کو ضرورت ہو تو غلطیوں پر رد عمل ظاہر کرسکتے ہیں ، یہ غلطی والے پیغامات کو فائل کو آلودہ کرنے سے بھی روکتا ہے stdout میں ری ڈائریکٹ کر دیا گیا ہے۔

ایڈیٹر میں مندرجہ ذیل متن ٹائپ کریں اور اسے ایک غلطی.ش نامی فائل میں محفوظ کریں۔

#! / bin / bash گونج "ایسی فائل تک رسائی حاصل کرنے کی کوشش کرنے کے بارے میں جو موجود نہیں ہے" cat bad-filename.txt

اس حکم سے اسکرپٹ پر عمل درآمد کریں:

chmod + x error.sh

اسکرپٹ کی پہلی لائن متن کے ذریعہ ٹرمینل ونڈو کی طرف اشارہ کرتی ہےstdout ندی. دوسری لائن کسی ایسی فائل تک رسائی حاصل کرنے کی کوشش کرتی ہے جو موجود نہیں ہے۔ یہ ایک غلطی پیغام پیدا کرے گا جو اس کے ذریعہ پہنچایا جاتا ہے stderr.

اس حکم کے ساتھ اسکرپٹ چلائیں:

./error.sh

ہم دیکھ سکتے ہیں کہ پیداوار کے دونوں سلسلے ، stdout اور stderr، ٹرمینل ونڈوز میں دکھائے گئے ہیں۔

آؤٹ پٹ کو کسی فائل میں ری ڈائریکٹ کرنے کی کوشش کرتے ہیں:

./error.sh> قبضہ.txt

غلطی کا پیغام جو کے ذریعے پہنچایا جاتا ہے stderr اب بھی ٹرمینل ونڈو پر بھیج دیا گیا ہے۔ ہم فائل کے مندرجات کو چیک کرسکتے ہیں کہ آیا stdout آؤٹ پٹ فائل میں چلا گیا۔

بلی کی گرفت. txt

سے آؤٹ پٹ stdin توقع کے مطابق فائل کو ری ڈائریکٹ کیا گیا تھا۔

> ری ڈائریکشن علامت کے ساتھ کام کرتا ہے stdout پہلے سے طے شدہ آپ عددی فائل ڈسکریپٹروں میں سے ایک کو اس بات کی نشاندہی کرنے کے لئے استعمال کرسکتے ہیں کہ آپ کون سا معیاری آؤٹ پٹ اسٹریم ری ڈائریکٹ کرنا چاہتے ہیں۔

واضح طور پر ری ڈائریکٹ کرنے کے لئے stdout، اس نئ سمت ہدایت کو استعمال کریں:

1>

واضح طور پر ری ڈائریکٹ کرنے کے لئے stderr، اس نئ سمت ہدایت کو استعمال کریں:

2>

آئیے دوبارہ اپنے آزمانے کی کوشش کریں ، اور اس بار ہم استعمال کریں گے 2>:

./error.sh 2> گرفت.txt

غلطی کا پیغام ری ڈائریکٹ اور ہے stdoutبازگشت ٹرمینل ونڈو پر پیغام بھیجا جاتا ہے:

آئیے دیکھتے ہیں کیپچر ڈاٹ ٹیکسٹ فائل میں کیا ہے۔

بلی کی گرفت. txt

stderr توقع کے مطابق پیغام گرفت میں ہے۔

stdout اور stderr دونوں کو ری ڈائریکٹ کرنا

بے شک ، اگر ہم بھی ری ڈائریکٹ کرسکتے ہیں stdout یا stderr ایک دوسرے سے آزادانہ طور پر فائل میں ، ہمیں ان دونوں کو بیک وقت ، دو مختلف فائلوں میں ری ڈائریکٹ کرنے کے قابل ہونا چاہئے؟

ہاں ہم کر سکتے ہیں. یہ حکم ہدایت کرے گا stdout کیپچر ڈاٹ ٹی ایس ٹی ایس نامی فائل پر stderr غلطی .txt نامی ایک فائل میں

./error.sh 1 >ग्रह. txt 2> نقص.txt

چونکہ آؤٹ پٹ کے دونوں سلسلے – معیاری آؤٹ پٹ اور معیاری خرابی files کو فائلوں میں ری ڈائریکٹ کیا جاتا ہے ، لہذا ٹرمینل ونڈو میں کوئی قابل آؤٹ پٹ نظر نہیں آتا ہے۔ ہم کمانڈ لائن پرامپٹ پر واپس آ گئے ہیں گویا کہ کچھ نہیں ہوا ہے۔

آئیے ہر فائل کے مندرجات کو چیک کرتے ہیں۔

بلی کی گرفت. txt
بلی کی غلطی. txt

stdout اور stderr کو اسی فائل میں ری ڈائریکٹ کیا جارہا ہے

یہ صاف ہے ، ہمارے پاس معیاری آؤٹ پٹ اسٹریمز میں سے ہر ایک اپنی سرشار فائل میں جا چکا ہے۔ صرف دوسرا مجموعہ جو ہم کر سکتے ہیں وہ ہے دونوں کو بھیجنا stdout اور stderr اسی فائل میں

ہم یہ کام مندرجہ ذیل کمانڈ سے حاصل کرسکتے ہیں۔

./error.sh> قبضہ.txt 2> & 1

چلو اسے توڑ دیں۔

  • ./error.sh: غلطی.ش اسکرپٹ فائل لانچ کرتی ہے۔
  • >ग्रह ڈاٹ ٹی ایس ٹی: ری ڈائریکٹ stdout کیپچر ڈاٹ ٹی ایس ٹی فائل میں رواں دواں۔ > کے لئے مختصر ہے 1>.
  • 2>&1: یہ &> ری ڈائریکٹ ہدایت کا استعمال کرتا ہے۔ یہ ہدایات آپ کو شیل کو یہ بتانے کی اجازت دیتی ہے کہ ایک ندی کو دوسری منزل کی طرح اسی منزل تک پہنچا دیا جائے۔ اس معاملے میں ، ہم کہہ رہے ہیں کہ "ری ڈائریکٹ اسٹریم 2 ، stderr، اسی منزل تک جو ندی 1 ، stdout، کو ری ڈائریکٹ کیا جارہا ہے۔ "

کوئی مرئی آؤٹ پٹ نہیں ہے۔ یہ حوصلہ افزا ہے

آئیے کیپچر ڈاٹ ٹی ایس ٹی فائل کو چیک کریں اور دیکھیں کہ اس میں کیا ہے۔

بلی کی گرفت. txt

دونوں stdout اور stderr اسٹریمز کو ایک ہی منزل کی فائل میں ری ڈائریکٹ کردیا گیا ہے۔

کسی اسٹریم کی آؤٹ پٹ کو ری ڈائریکٹ کرنے اور خاموشی سے پھینک دینے کے ل the ، آؤٹ پٹ کو ڈائریکٹ کریں / dev / null.

اسکرپٹ میں ری ڈائریکشن کا پتہ لگانا

ہم نے تبادلہ خیال کیا کہ کوئی کمانڈ کس طرح پتہ لگاسکتی ہے کہ آیا کسی بھی سلسلے کو ری ڈائریکٹ کیا جارہا ہے ، اوراس کے مطابق اس کے طرز عمل میں ردوبدل کرنے کا انتخاب کرسکتے ہیں۔ کیا ہم اسے اپنی اپنی رسم الخط میں پورا کرسکتے ہیں؟ ہاں ہم کر سکتے ہیں. اور سمجھنے اور اس کو استعمال کرنے کی ایک بہت ہی آسان تکنیک ہے۔

ایک ایڈیٹر میں درج ذیل عبارت کو ٹائپ کریں اور اسے ان پٹ.ش کے بطور محفوظ کریں۔

#! / بن / باز اگر [-t 0]؛ پھر کی بورڈ سے آنے والی ایکو اسٹڈین دوسری صورت میں ایکو اسٹڈین پائپ یا فائل فائل سے آرہا ہے

اس پر عملدرآمد کیلئے مندرجہ ذیل کمانڈ کا استعمال کریں:

chmod + x input.sh

ہوشیار حصہ مربع خط وحدانیت میں ٹیسٹ ہے۔ -t (ٹرمینل) آپشن درست (0) لوٹاتا ہے اگر فائل ڈسریکٹر سے وابستہ فائل ٹرمینل ونڈو میں ختم ہوجاتی ہے۔ ہم نے فائل کی وضاحت 0 کو استدلال کی دلیل کے طور پر استعمال کیا ہے ، جو نمائندگی کرتا ہےstdin.

اگر stdin ٹرمینل ونڈو سے جڑا ہوا ہے ٹیسٹ صحیح ثابت ہوگا۔ اگر stdin فائل یا پائپ سے جڑا ہوا ہے ، ٹیسٹ ناکام ہوگا۔

ہم اسکرپٹ میں ان پٹ پیدا کرنے کے لئے کوئی بھی آسان ٹیکسٹ فائل استعمال کرسکتے ہیں۔ یہاں ہم ڈمی ڈاٹ ٹیکسٹ نامی ایک استعمال کر رہے ہیں۔

./input.sh <dummy.txt

آؤٹ پٹ سے پتہ چلتا ہے کہ اسکرپٹ نے پہچان لیا ہے کہ ان پٹ کی بورڈ سے نہیں آرہا ہے ، یہ فائل سے آرہا ہے۔ اگر آپ نے اس کا انتخاب کیا ہے تو آپ اس کے مطابق اپنے اسکرپٹ کے طرز عمل کو مختلف کرسکتے ہیں۔

یہ فائل ری ڈائریکٹریشن کے ساتھ تھا ، آئیے پائپ سے اسے آزمائیں۔

بلی dummy.txt | ./input.sh

اسکرپٹ نے پہچان لیا ہے کہ اس میں اس کا ان پٹ لگا ہوا ہے۔ یا زیادہ واضح طور پر ، یہ ایک بار پھر پہچانتا ہے کہ stdin ندی ایک ٹرمینل ونڈو سے منسلک نہیں ہے۔

آئیے اسکرپٹ کو نہ تو پائپ اور نہ ہی ری ڈائریکٹ کے ساتھ چلاتے ہیں۔

./input.sh

stdin ندی ٹرمینل ونڈو سے منسلک ہے ، اور اسکرپٹ اس کے مطابق رپورٹ کرتا ہے۔

آؤٹ پٹ اسٹریم کے ذریعہ ایک ہی چیز کی جانچ کرنے کے ل we ، ہمیں ایک نئی اسکرپٹ کی ضرورت ہے۔ ایک ایڈیٹر میں درج ذیل کو ٹائپ کریں اور اسے آؤٹ پٹش کے بطور محفوظ کریں۔

#! / بن / باز اگر [-t 1]؛ پھر ایکو اسٹڈ آؤٹ ٹرمینل ونڈو پر جارہا ہے ورنہ ایکو اسٹڈ آؤٹ ری ڈائریکٹ ہو رہا ہے یا پائپڈ فائی

اس پر عملدرآمد کیلئے مندرجہ ذیل کمانڈ کا استعمال کریں:

chmod + x input.sh

اسکرپٹ میں صرف قابل ذکر تبدیلی اسکوائر بریکٹ میں ٹیسٹ میں ہے۔ ہم فائل ڈسکرپٹر کی نمائندگی کرنے کیلئے ہندسہ 1 استعمال کررہے ہیں stdout.

آئیے اسے آزمائیں۔ ہم پیداوار کو پائپ کریں گے کیٹ.

./ آؤٹ پٹ | کیٹ

اسکرپٹ نے پہچان لیا ہے کہ اس کا آؤٹ پٹ براہ راست ٹرمینل ونڈو میں نہیں جا رہا ہے۔

آؤٹ پٹ کو کسی فائل میں ری ڈائریکٹ کرکے ہم اسکرپٹ کو بھی جانچ سکتے ہیں۔

./output.sh> قبض.txt

ٹرمینل ونڈو میں کوئی آؤٹ پٹ نہیں ہے ، ہم خاموشی سے کمانڈ پرامپٹ پر واپس آئے ہیں۔ جیسا کہ ہم توقع کر رہے ہیں۔

ہم کیپچر ڈاٹ ٹی ایس ٹی فائل کے اندر دیکھ سکتے ہیں کہ یہ کیا معلوم ہے ایسا کرنے کے لئے درج ذیل کمانڈ کا استعمال کریں۔

بلی کی گرفت

ایک بار پھر ، ہمارے اسکرپٹ میں سادہ ٹیسٹ سے پتہ چلتا ہے کہ stdout ندی کو براہ راست ٹرمینل ونڈو پر نہیں بھیجا جا رہا ہے۔

اگر ہم اسکرپٹ کو بغیر کسی پائپ یا ری ڈائریکشن کے چلاتے ہیں تو اسے اس کا پتہ لگانا چاہئے stdout براہ راست ٹرمینل ونڈو پر پہنچایا جارہا ہے۔

./output.sh

اور یہی کچھ ہم دیکھ رہے ہیں۔

شعور کی دھاریں

یہ بتانا کہ آپ کے اسکرپٹس کو ٹرمینل ونڈو ، یا پائپ سے جڑا ہوا ہے یا ری ڈائریکٹ کیا جارہا ہے ، آپ کو اس کے مطابق ان کے طرز عمل کو ایڈجسٹ کرنے کی سہولت دیتی ہے۔

لاگنگ اور تشخیصی آؤٹ پٹ زیادہ یا کم تفصیلی ہوسکتی ہے ، اس پر منحصر ہے کہ یہ اسکرین پر جا رہا ہے یا فائل میں۔ معمولی پروگرام آؤٹ پٹ سے غلطی کے پیغامات کو کسی مختلف فائل میں لاگ کیا جاسکتا ہے۔

جیسا کہ عام طور پر ہوتا ہے ، زیادہ علم مزید اختیارات لاتا ہے۔


$config[zx-auto] not found$config[zx-overlay] not found