سلام دوستان
یه موردی ک ذهنمو مشغول کرده
راجب مقادیری هستش ک یه دستور یا یه اپ ب stdout پرتاب میکنه و از طریق پایپ ب stdin بعدی داده میشه
مثلا
دستور cat میاد کل مقدار یک فایل رو یه جا پرتاب میکنه ب stdout
cat ./file.lst | bat -A
گاهی وقتا هست ک مقادیر زیاد میشه
و یه جا پرتاب کردنش زمان بره
یا خیلی از دستورات ب صورت تکی مقادیر رو پرتاب میکنن
(مثالی حضور ذهن ندارم متأسفانه)
سوالم اینکه
میخوام تشخیص بدم ک یه دستور یا یه اپ
مقادیر رو چجوری پرتاب میکنه ب stdout ؟
یه جا پرتاب میکنه ؟
یا لحظه ای ؟
چون هر چی تعداد پایپ ها بره بالا یا زنجیر وار چندتا دستور کنار هم چیده شه
بسته ب این دو حالت زمان تلف میشه
(نمیدونم منظورمو خوب رسوندم یا ن)
سختش نکن استریم ها هم مثل فایلن وقتی داری یه چیزی رو میدی به stdout مثل اینه که داری میریزی تو یه فایل با همون روند یعنی کامل خونده میشه بعد ریخته یا پرتاب میشه اونجا (stdout)
اینجا کامل توضیح داده
(فکر کنم همون حالت استریم ک گفتی مد نظرم باشه)
(نمیدونم من منظورمو خوب نرسوندم یا بد متوجه حرفتون شدم)
اینی ک گفتی ینی در هر دو صورت چ حالت استریم چ حالت یه جا پرتاب کردن
ب پایپ بعدی میرسه
خب اونجوری ک من متوجه شدم
ترکیب چندتا کامند رو کنار هم بزاریم
بعد از دو تا پایپ
ب یه حالتی مث انتظار میره تا دستور قبلی کامل کارشو انجام بده
خب این وقفه اذیت کننده اس
مثلا فرض کنین یه کامند هست ک مدام هر یک ثانیه یه متنی رو پرتاب میکنه
و این پایپ میشه ب دستور sort -u
خب منطق اینجوری میگه ک این sort
باس منتظر بمونه تا کامند قبلی کارش تموم شه بعد سورت کنه بعد بده ب stdout و پایپ شه ب دستور بعدی
بنظرت این وقفه طبیعیه یا میشه با یه ترفندی این وقفه رو نداشت ؟
این وقفه طبیعیه دیگه وقتی دستور sort ورودیش رو کامل نگرفته چجوری مقادیر رو کامل و درست مرتب کنه؟
فکر کنم تو میگی هرچی در لحظه خونده شد تحویل sort داده شه و همون لحظه بچینه رو خروجی؟
خب اینکه کاملا غیرمنطقیه و نمیشه باید تمام مقادیر رو داشته باشه کارشو بکنه
اون دستور فایند که گفت خود دستوره که اینجوری کار میکنه با خروجیش ربطی به stdout stdin نداره
اگه اینو میخوای تا وقتی که کار یکی تموم نشده دومی نمیتونه کارشو بکنه مثلا اینجا تا وقتی کنترل D زده نشده دستورxrags ls ورودی رو نمیگیره
بستگی داره به دستور اول (سمت چپ pipe) چون تا وقتی اون دستور سیگنال نفرسته
Pipe input
بسته نمیشه،
پس وقتی دستوری مثل cat , ... گذاشته میشه دیتای stoud وقتی برای pipe میره که خروجی کامل بشه
روی دستوری مثل find مثلاً داستان فرق میکنه و میتونه بصورت stream هم پردازش بشه
ببخشید یه سوالی ک الان ب ذهنم اومد اینه ک
چجوری میشه حالتی ک پایپ اینپوتش حالا حالا بسته نمیشه رو تبدیل کرد ب حالت استریم ؟؟
یه مثال ساده بخوام بزنم
لاگ فایل هستش ک با tail -f ب صورت لایو میتونیم ببینیم
ولی قابلیت پایپ کردن یا cat کردنش فقط در لحظه اس
یه روند ادامه داری هستش
امیدوارم رسونده باشم لپ مطلب رو 😅
متوجه نشدم
درستش چیه ولی اگر بخواید ی دستور رو چندین بار خروجی بگیرید
watch
رو داریم
اگر منظورتون خود pipe هست که خروجی سمت چپ رو stream بگیره (همه حال)
هیچ option براش ندارید
Code it
من راهی نمیشناسم
دقیقا میخوای هرچی در لحظه پرینت شد رو صفحه جای دیگه داشته باشیش؟
این کارو با شل نمیدونم چجوری میشه انجام داد ولی با پایتون میشه خودم قبلا نیاز داشتم به چنین مساله ای شبیه به این مورد
اسم عملیاتش رو نمیدونم سرچ کن خوندن خروجی یک pts مجزا یا یک پروسه در حال اجرا انگلیسی سرچ کن فارسی چیزی گیر نمیاری
البته تو خود شل هم میشه با strace این کارو کرد یعنی اتچ شی به اون پروسه ولی بازم همون آش و همون کاسه ست
اون strace اتچ میشه به پروسه tail و هرچی که قراره تو خروجی استاندارد write کنه رو میریزه تو فایل log
میتونی آپشنی بدی بهش که فقط نتیجه خروجی رو بریزه به جای ساختار کامل syscall
تو این حالت نمیشه اما بازم مشکلی نیست میتونی خروجی رو خودت با " کات کنی به فیلد ۲ که مقدار پرینت شده ست
من دقیق متوجه خواسته نشدم... اما اگر هدف اینه که
$ command_A | command_B
دستور A به مدت طولانی در حال خروجی دادن باشه و ما بخوایم موقع کار کردنش پایپ کنه به B، فقط کافیه از unbuffer استفاده کنید.
Un fil public ouvert issu de l'index de recherche
ChatCrawler — « le Google du Telegram public » ; actualisé à mesure que la communauté est explorée.
Les heures sont en UTC.