کاربرد دستور yes در لینوکس – از صفر تا صد


شاید به نظر برسد که دستور yes در لینوکس برای هر گونه استفاده عملی دستور آسانی است، اما در این راهنما نشان میدهیم که کاربرد آن چگونه است و به چه شیوهای میتوانید از این پاسخ مثبت در لینوکس و macOS استفاده کنید.
دستور yes
دستور yes یکی از سادهترین دستورها در لینوکس و دیگر سیستمهای عامل شِبه لینوکس مانند macOS است. منظور ما از ساده، کاربرد آن و پیادهسازی اولیه آن است. کد منبع نسخه اصلی که در System 7 Unix انتشار یافته و از سوی Ken Thompson نوشته شده است تنها شامل شش خط میشود.
اما همه اینها به این معنی نیست که yes دستور کوچکی محسوب میشود. این دستور میتواند به روشهای جالب و مفیدی مورد استفاده قرار گیرد.
دستور yes چه کاری انجام میدهد؟
وقتی دستور yes بدون هیچ پارامتر خط فرمان استفاده شود مانند این است که حرف y را وارد کرده و اینتر را بارها و بارها با سرعت خیلی بالا بزنید. این دستور تا زمانی که کلیدهای Ctrl+C را برای متوقف کردنش نزدهاید به اجرای خود ادامه میدهد.
yes
در واقع میتوانید از دستور yes برای تائید مکرر هر پیامی که میخواهید استفاده کنید. کافی است عبارت yes و یک فاصله و سپس رشته مورد نظر خود را وارد کنید و اینتر را بزنید. این دستور عموماً برای تولید یک جریان خروجی از رشتههای yes یا no مورد استفاده میگیرد:
yes yes
yes anything you like
کاربرد دستور yes در لینوکس چیست؟
خروجی دستور yes میتواند در برنامهها یا اسکریپتهای دیگر Pipe شود. آیا این گفته آشنا است؟ فرض کنید یک پردازش طولانی را روی سیستم اجرا کرده و به جای دیگری رفتهاید تا اجرا شود. زمانی که به سر رایانه خود بازمیگردید میبینید که پردازش مربوطه هنوز کامل نشده است. دلیل آن این است که در غیاب شما یک سؤال پرسیده است و پاسخ آن یک yes یا no ساده بوده است.
اگر از قبل بدانید که همه پاسخها yes یا y خواهند بود یا no یا n هستند میتوانید با استفاده از دستور yes پاسخهایی برای این سؤالات آماده کنید. پردازش طولانی شما بدون وقفه تا تکمیل شدن پیش میرود و دستور yes به هر سؤالی که پرسیده شود پاسخ خواهد داد.
استفاده از yes در اسکریپتها
به اسکریپت پوسته Bash زیر توجه کنید. تصور کنید این بخشی از یک اسکریپت طولانیتر است که زمان زیادی برای اجرا نیاز دارد.
#!/bin/bash # ... # in the middle of some long script # obtain a response from the user # ... echo "Are you happy to proceed? [y,n]" read input # did we get an input value? if [ "$input" == "" ]; then echo "Nothing was entered by the user" # was it a y or a yes? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "Positive response: $input" # treat anything else as a negative response else echo "negative response: $input" fi
این اسکریپت یک سؤال میپرسد و منتظر یک پاسخ میماند. گردش منطقی درون اسکریپت بر اساس ورودی کاربر تصمیمگیری میشود:
- ورود عبارت yes یا y نشاندهنده پاسخ مثبت است.
- ورود هر چیز دیگری پاسخ منفی تلقی میشود.
- زدن اینتر بدون وارد کردن هیچ عبارتی به معنی انجام ندادن کار خاصی است.
برای تست کردن این اسکریپت آن را به یک فایل کپی کرده و با نام long_script.sh ذخیره کنید. از دستور homod استفاده کنید تا آن را به حالت اجرایی دربیاورید.
chmod +x long_script.sh
اسکریپت را با دستور زیر اجرا کنید. وضعیت وارد کردن عبارتهای yes یا y و هر چیز دیگر در ورودی شامل زدن اینتر بدون متن خاص را بررسی کنید.
./long_script.sh
برای این که yes پاسخهای ما را به عملیات اسکریپت تبدیل کند، خروجی را از yes به اسکریپت Pipe میکنیم.
yes |./long_script.sh
برخی اسکریپتها ساختار سختگیرانهتری دارند و تنها کلمه کامل yes را به عنوان پاسخ مثبت قبول میکنند. شما میتوانید عبارت yes را به عنوان پارامتر دستور yes به صورت زیر وارد کنید:
yes yes |./long_script.sh
بدون بررسی کامل «بله» نگویید
اگر میخواهید عبارت yes را در یک برنامه یا اسکریپت وارد کنید تا قطعاً به خروجی مطلوب خود دست پیدا کنید، باید در مورد ورودی خود مطمئن باشید. برای این که بتوانید در مورد این تصمیم مطمئن باشید، باید سؤالات و پاسخهای آنها را بدانید.
منطق این اسکریپت، دستور یا برنامه ممکن است با انتظارات شما مطابقت نداشته باشد. در اسکریپت نمونه بخش قبل سؤال ممکن است به صورت زیر باشد:
Do you wish to stop? [y،n].
در این حالت وارد کردن عبارت منفی باعث میشود که اسکریپت به کار خود ادامه دهد. شما باید با اسکریپت، دستور، یا برنامه از قبل آشنا باشید تا بتوانید yes را درون آن Pipe کنید.
استفاده از yes به همراه دستورهای دیگر
در ابتدای راه دستور Yes با سایر دستورات لینوکس مورد استفاده قرار میگرفت؛ از همان موقع، اینگونه دستورات رفته رفته هر یک راهی ارائه کردند تا بدون دخالت کاربر در میانه عملیات به صورت کامل اجرا شوند. همین امر نیز سبب شد Yes به تنهایی نیازمند ارائه چنین روشی نباشد.
اجازه بدهید در این رابطه به یک مثال درباره ابزار مدیریت پکیج در اوبونتو، apt-get، بپردازیم. برای نصب این اپلیکیشن بدون نیاز به فشردن کلید «Y» در وسط عملیات نصب، دستور Yes را به شیوهای که در ادامه مشاهده میکنید مورد استفاده قرار خواهیم داد:
همین نتیجه را میتوان با استفاده از گزینه y- در apt-get نیز به دست آورد:
sudo apt-get -y install fortune-mod
همچنان که میبینید apt-get سؤال معمول خود یعنی «[Do you want to continue? [Y/n» را نمیپرسد. تصور این دستور آن است که پاسخ yes است. روی توزیعهای دیگر لینوکس نیز وضعیت مشابهی وجود دارد. روی لینوکس فدورا زمانی میتوانستیم از این نوع دستور مدیریت پکیج استفاده کنیم:
yes | yum install fortune-mod
ابزار مدیریت پکیج dnf جایگزین yum شده است و dnf گزینه خاص خود یعنی y- را دارد:
dnf -y install fortune-mod
همین وضعیت در مورد cp ،fsck و rm نیز وجود دارد. این دستورها هر کدام گزینههای f- (الزام) یا y- (فرض بله) را دارند. اینک سؤال این است که آیا yes طوری تنظیم شده است که تنها با اسکریپتها کار کند؟ پاسخ این است که نه همیشه هم چنین نیست. این دستور قدیمی ترفندهای کاربردی دیگری نیز دارد.
ترفندهای دیگر yes
شما میتوانید از yes در یک توالی از ارقام که از سوی seq برای کنترل حلقهای کارهای تکراری ایجاد شدهاند استفاده کنید. echo-های تکخطی، ارقامی را روی پنجره ترمینال تولید میکنند و سپس sleep را به مدت یک ثانیه فراخوانی میکنند.
بدین ترتیب به جای echo کردن صرف ارقام در پنجره ترمینال میتوانیم اسکریپت یا دستور دیگر را فراخوانی کنیم. این دستور یا اسکریپت حتی لازم نیست از رقمها استفاده کند و این تنها یک آغاز برای هر چرخه از حلقه محسوب میشود.
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
برخی اوقات بهتر است فایل بزرگی داشته باشیم تا با آن موارد مختلفی را تست کنیم. شاید بخواهید از دستور zip استفاده کنید یا بخواهید فایلهای با اندازههای مختلف برای تست آپلودهای FTP داشته باشید.
تولید فایلهای بزرگ
با استفاده از دستور yes میتوان فایلهای بزرگی تولید کرد و تنها چیزی که لازم است این است که یک رشته متن طولانی به آن بدهید و خروجی آن را به یک فایل هدایت کنید. لطفاً اشتباه کنید چون این فایلها بسیار سریع بزرگ میشوند. بنابراین آماده باشید که در طی چند ثانیه Ctrl+C را بزنید.
yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt
در مثال فوق در طی چند ثانیه یک فایل روی سیستم تست برای بررسی تحقیقی این مقاله ایجاد شد. دستور ls گزارش میدهد که اندازه این فایل 557 مگابایت است و wc اعلام میکند که 12.4 میلیون خط درون این فایل وجود دارد.
ما میتوانیم اندازه فایل را با گنجاندن head در رشته دستور خود محدود کنیم. بدین ترتیب به دستور اعلام میکنیم که باید چند خط را در فایل متنی قرار دهد. 50- به این معنی است که head تنها 50 خط از متن را در فایل text.txt باید درج کند.
yes long line of meaningless text for file padding | head -50 > test.txt
به محض این که 50 خط در فایل test.txt قرار گیرد، این پردازش متوقف خواهد شد. لازم نیست از Ctrl+C استفاده کنید. این دستور در زمان مقرر شده به صورت خودکار متوقف خواهد شد. wc گزارش میدهد که این فایل دقیقاً 50 خط، 400 کلمه و 2350 بایت دارد.
سخن پایانی
با این که دستور yes برای وارد کردن پاسخها در اسکریپتهای با زمان اجرای طولانی مفید است اما این دستور قرار نیست بخشی از کیت ابزار روزمره شما برای دستورها باشد. در هر حال زمانی که لازم باشد از آن استفاده کنید، آن را دستور سادهای خواهید یافت. این دستور طلایی با صرفاً شش خط کد!
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای لینوکس (Linux)
- گنجینه آموزشهای لینوکس (Linux)
- مجموعه آموزش مهارت های کاربردی کامپیوتر (ICDL)
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش ترمینال لینوکس — راهنمای شروع به کار
- سیستم عامل لینوکس — راهنمای جامع
==