رفتن به محتوا
مبانی کامپیوتر و اینترنتکامپیوتر از دروندرس ۵ از ۱۶

صفحه‌کلید و نمادها برای کار با ترمینال

اسم و جای نمادهایی که در دستورها زیاد می‌بینی (~ / \ | ' " ` $ # & * > <)، عوض کردن زبان صفحه‌کلید، و تله‌ی کاراکترهای شبیه هم: عدد فارسی، خط‌تیره‌ی بلند، کوتیشن کج و فاصله‌ی نشکن که هنگام کپی از تلگرام و Word دستور را خراب می‌کنند.

  • حدود ۱۵ دقیقه مطالعه
  • ۶ مثال اجراشده
  • ۳ تمرین با جواب
  • مقدماتی (از صفر مطلق)
  • به‌روزرسانی: ۲۹ مهر ۱۴۰۵

توی این درس یاد می‌گیری نمادهایی را که در همه‌ی دستورها می‌بینی (مثل ~، /، |، $ و >) به اسم بشناسی و بدانی روی صفحه‌کلید کجا هستند، زبان صفحه‌کلید را سریع عوض کنی، و مهم‌تر از همه: کاراکترهای شبیه هم را تشخیص بدهی. عدد فارسی ۵ با عدد انگلیسی 5، خط‌تیره‌ی بلند – با خط‌تیره‌ی معمولی -، و کوتیشن کج ‘ با کوتیشن صاف ' برای چشم تو یکی‌اند ولی برای کامپیوتر نه. این درس جلوی ساعت‌ها گیج شدن را می‌گیرد.

مسئله: «دقیقاً همان را نوشتم، ولی کار نمی‌کند!»

Section titled “مسئله: «دقیقاً همان را نوشتم، ولی کار نمی‌کند!»”

یک دستور را از یک آموزش، پیام تلگرام یا فایل Word کپی می‌کنی، در ترمینال می‌چسبانی و خطا می‌گیری. دوباره نگاه می‌کنی: حرف‌به‌حرف همان است. ولی نیست. در درس قبل دیدی هر حرف برای کامپیوتر یک عدد (کد یونیکد و چند بایت) است. بعضی حرف‌ها شکل یکسان و کد متفاوت دارند، و ترمینال فقط کد را می‌بیند.

کاراکترهای شبیه هم مثل دوقلوهای همسان هستند: از دور یکی‌اند، ولی کد ملی‌شان (کد یونیکد) فرق دارد. نگهبان ساختمان (ترمینال) فقط کارت شناسایی را نگاه می‌کند، نه صورت را. پس اگر به‌جای دوقلوی «درست»، دوقلوی «اشتباه» را بفرستی، راهش نمی‌دهد، هر چقدر هم شبیه باشد.

نمادهایی که باید بشناسی

Section titled “نمادهایی که باید بشناسی”

این‌ها را در همه‌ی دوره‌ها می‌بینی. لازم نیست معنی‌شان را حفظ کنی (هر کدام در درس خودش می‌آید)؛ فقط اسم و جای هر کدام را بدان تا وقتی آموزش گفت «پایپ بزن» یا «تیلدا»، معطل نشوی.

نماد اسم انگلیسی اسم رایج فارسی کجای صفحه‌کلید کاربرد نمونه
~ tilde تیلدا گوشه‌ی بالا چپ، با Shift پوشه‌ی خانه: cd ~
` backtick بک‌تیک همان کلید تیلدا، بدون Shift Markdown و بعضی دستورها
/ slash اسلش کنار Shift راست جداکننده‌ی مسیر در لینوکس: /home/ali
\ backslash بک‌اسلش بالای Enter جداکننده‌ی مسیر در ویندوز: C:\Users
| pipe پایپ همان کلید بک‌اسلش، با Shift خروجی یک دستور به دیگری
- hyphen / dash خط‌تیره، منفی کنار عدد ۰ گزینه‌ها: ls -l
_ underscore زیرخط همان کلید، با Shift در اسم فایل: my_file.txt
' single quote کوتیشن تکی کنار Enter echo 'متن'
" double quote کوتیشن دوتایی همان کلید، با Shift echo "متن"
$ dollar دلار Shift+4 متغیر: $HOME
# hash هشتگ Shift+3 توضیح در اسکریپت؛ پرامپت root
& ampersand اَند Shift+7 اجرا در پس‌زمینه
* asterisk / star ستاره Shift+8 «هر چیزی»: *.txt
> و < greater / less than بزرگ‌تر و کوچک‌تر Shift+نقطه و Shift+ویرگول فرستادن خروجی به فایل
[ ] و { } و ( ) brackets, braces, parentheses براکت، آکولاد، پرانتز کنار P و عددهای ۹ و ۰ گروه‌بندی و الگوها
. dot نقطه پایین راست پوشه‌ی فعلی؛ فایل پنهان

دستورهای این درس روی Ubuntu اجرا شده‌اند و فعلاً فقط ببین و بخوان؛ در دوره‌ی لینوکس همه را خودت امتحان می‌کنی. نکته‌ی اصلی، پیام خطاهاست: یاد بگیری از روی آن‌ها کاراکتر اشتباه را پیدا کنی.

ترمینال عدد فارسی را عدد نمی‌داند. sleep باید چند ثانیه صبر کند؛ با عدد فارسی:

Terminal window
sleep ۵
خروجی
sleep: invalid time interval ‘۵’
Try 'sleep --help' for more information.

invalid time interval یعنی «این را به‌عنوان مدت زمان نمی‌شناسم». برای کامپیوتر ۵ فارسی یک حرف است، نه عدد. حتی حساب ساده هم کار نمی‌کند:

Terminal window
echo $((۲+۲))
خروجی
bash: ۲+۲: syntax error: operand expected (error token is "۲+۲")

با عدد انگلیسی (echo $((2+2))) جواب 4 است. قاعده: در دستورها، آدرس IP، شماره‌ی پورت و هر جای فنی، فقط عدد انگلیسی.

مثال ۲: خط‌تیره‌ی بلند

Section titled “مثال ۲: خط‌تیره‌ی بلند”

برنامه‌هایی مثل Word و تلگرام گاهی - یا -- را خودکار به خط‌تیره‌ی بلند (– یا —) تبدیل می‌کنند:

Terminal window
ls –l
خروجی
ls: cannot access '–l': No such file or directory

ls گزینه‌ی -l را نشناخت و –l را اسم یک فایل فرض کرد. هر وقت خطایی دیدی که یک «گزینه» را در کوتیشن به‌عنوان اسم فایل آورده، به خط‌تیره شک کن.

کوتیشن صاف (' و ") برای shell معنی دارد. کوتیشن کج (‘ ’ و “ ”) که ویرایشگرهای متن به‌جایش می‌گذارند، برای shell فقط یک حرف معمولی است:

Terminal window
echo "سلام دنیا"
echo “سلام دنیا”
ls ‘a.txt’
خروجی
سلام دنیا
“سلام دنیا”
ls: cannot access '‘a.txt’': No such file or directory

با کوتیشن صاف، echo فقط متن را چاپ کرد. با کوتیشن کج، خود علامت‌ها هم چاپ شدند (یعنی shell آن‌ها را کوتیشن نفهمید)، و ls دنبال فایلی گشت که اسمش واقعاً با ‘ شروع می‌شود.

مثال ۴: فاصله‌ی نشکن (فاصله‌ی نامرئی)

Section titled “مثال ۴: فاصله‌ی نشکن (فاصله‌ی نامرئی)”

این از همه موذی‌تر است. بعضی برنامه‌ها به‌جای فاصله‌ی معمولی یک فاصله‌ی نشکن (non-breaking space) می‌گذارند که اصلاً دیده نمی‌شود:

خروجی (دستور ls -l که با فاصله‌ی نشکن کپی شده)
bash: ls -l: command not found

shell کل ls -l را یک کلمه دید (چون فاصله‌ی واقعی بینشان نبود) و دنبال برنامه‌ای با اسم «ls -l» گشت. نشانه‌اش همین است: command not found برای دستوری که مطمئنی وجود دارد، و اسمی که در خطا آمده خودش فاصله دارد.

⚡ بررسی سریع

خطای «bash: ls -l: command not found» به احتمال زیاد یعنی…

مثال ۵: کاراکترها را با چشم کامپیوتر ببین

Section titled “مثال ۵: کاراکترها را با چشم کامپیوتر ببین”

دستور od بایت‌های واقعی هر متن را (به مبنای ۱۶؛ درس بیت و بایت) نشان می‌دهد. دوقلوها را کنار هم بگذار:

Terminal window
echo -n "-" | od -An -tx1
echo -n "–" | od -An -tx1
echo -n "5" | od -An -tx1
echo -n "۵" | od -An -tx1
خروجی
2d
e2 80 93
35
db b5

خط‌تیره‌ی معمولی یک بایت است (2d)، خط‌تیره‌ی بلند سه بایت (e2 80 93). عدد 5 انگلیسی یک بایت (35)، و ۵ فارسی دو بایت (db b5). از دید کامپیوتر این‌ها هیچ شباهتی به هم ندارند.

مثال ۶: تیلدا و پوشه‌ی خانه

Section titled “مثال ۶: تیلدا و پوشه‌ی خانه”

~ میان‌بر «پوشه‌ی خانه‌ی من» است، ولی فقط وقتی تنها و اول یک کلمه باشد و داخل کوتیشن نباشد:

Terminal window
echo ~
echo "~"
خروجی
/home/ali
~

بدون کوتیشن، shell ~ را به /home/ali تبدیل کرد؛ داخل کوتیشن، همان علامت ماند. این را در درس ترمینال و shell دقیق‌تر می‌بینی.

پشت پرده: چرا ترمینال این‌قدر سخت‌گیر است؟

Section titled “پشت پرده: چرا ترمینال این‌قدر سخت‌گیر است؟”

یک انسان وقتی ۵ یا 5 می‌بیند، معنی را می‌فهمد. ولی برنامه‌ها متن را بایت‌به‌بایت مقایسه می‌کنند: ls دنبال دقیقاً بایت 2d می‌گردد تا بفهمد یک گزینه شروع شده، و shell دنبال دقیقاً بایت 20 (فاصله) یا 27 (کوتیشن) می‌گردد تا دستور را به کلمه‌ها خرد کند. این سخت‌گیری عیب نیست: باعث می‌شود رفتار دستورها قابل پیش‌بینی باشد. فقط کافی است تو بدانی چه چیزی را به آن می‌دهی.

برای همین در این دوره‌ها همه‌ی دستورها داخل بلوک کد نوشته شده‌اند: بلوک کد هیچ کاراکتری را «زیبا» نمی‌کند و همان بایت‌های درست را نگه می‌دارد.

شبیه‌سازی‌شده درست نشانه در پیام خطا
۰۱۲۳۴۵۶۷۸۹ (فارسی) 0123456789 invalid، syntax error، operand expected
– یا — - گزینه‌ای مثل '–l' در خطا به‌عنوان اسم فایل
‘ ’ و “ ” ' و " خود علامت‌ها در خروجی چاپ می‌شوند
فاصله‌ی نشکن فاصله‌ی معمولی command not found با اسمی که فاصله دارد
ي و ك عربی ی و ک فارسی جستجو و مقایسه جواب نمی‌دهد (درس قبل)

۱) کپی دستور از جای نامطمئن

Section titled “۱) کپی دستور از جای نامطمئن”

متن پیام‌رسان‌ها، Word و بعضی سایت‌ها کاراکترها را «زیبا» می‌کنند. راه‌حل: دستور را از بلوک کد کپی کن، یا خودت تایپش کن (برای یاد گرفتن، تایپ کردن خودش بهتر است).

۲) تایپ با صفحه‌کلید فارسی

Section titled “۲) تایپ با صفحه‌کلید فارسی”

اگر زبان صفحه‌کلید فارسی بماند، به‌جای l حرف «م» و به‌جای s حرف «س» تایپ می‌شود و خطای command not found برای اسمی فارسی می‌گیری. راه‌حل: قبل از ترمینال، زبان را انگلیسی کن.

لینوکس و اینترنت (آدرس سایت‌ها) از / استفاده می‌کنند و ویندوز از \. cd \home\ali در لینوکس کار نمی‌کند. راه‌حل: در لینوکس همیشه /.

۴) فراموش کردن Shift برای نمادها

Section titled “۴) فراموش کردن Shift برای نمادها”

| و " و _ و ~ همه با Shift می‌آیند؛ بدون Shift، \ و ' و - و ` تایپ می‌شود که معنی کاملاً دیگری دارند. راه‌حل: بعد از تایپ، قبل از Enter، یک بار دستور را نگاه کن.

تمرینآسان

اسم این نمادها را بنویس و بگو روی صفحه‌کلید با کدام کلید می‌آیند: ~، |، $، \، _.

دیدن جواب
  • ~ تیلدا: گوشه‌ی بالا چپ، با Shift.
  • | پایپ: کلید بالای Enter (همان بک‌اسلش)، با Shift.
  • $ دلار: Shift+4.
  • \ بک‌اسلش: کلید بالای Enter، بدون Shift.
  • _ زیرخط: کلید کنار ۰، با Shift.

(روی بعضی لپ‌تاپ‌ها جای بک‌اسلش و پایپ فرق می‌کند؛ کنار Shift چپ یا کنار Backspace.)

تمرینمتوسط

تمرین اصلی: این سه خطا را بخوان و برای هر کدام بگو کدام کاراکتر اشتباه بوده و درستش چیست.

۱) ping: ۸.۸.۸.۸: Name or service not known
۲) ls: cannot access '–la': No such file or directory
۳) bash: cd /tmp: command not found
دیدن جواب

۱) آدرس IP با عدد فارسی نوشته شده. ping آن را اسم یک سایت فرض کرده و پیدایش نکرده. درست: ping 8.8.8.8.

۲) خط‌تیره‌ی بلند (–) به‌جای -. ls آن را اسم فایل فرض کرده. درست: ls -la.

۳) بین cd و /tmp یک فاصله‌ی نشکن هست، برای همین shell کل «cd /tmp» را یک کلمه دیده. (اگر فاصله درست بود، shell دستور cd را پیدا می‌کرد؛ اینکه کل «cd /tmp» را اسم یک دستور فرض کرده یعنی فاصله واقعی نیست.) درست: دستور را دوباره خودت تایپ کن.

تمرینسخت

توضیح بده چرا echo -n "۵" | od -An -tx1 دو بایت چاپ می‌کند ولی echo -n "5" | od -An -tx1 یک بایت، و این به کدام موضوع درس «متن و encoding» برمی‌گردد.

دیدن جواب

عدد 5 انگلیسی جزو ۱۲۸ حرف اول (ASCII) است و در UTF-8 فقط یک بایت (35 در مبنای ۱۶، یعنی ۵۳) می‌گیرد. ۵ فارسی کد یونیکد U+06F5 دارد که خارج از ASCII است، پس UTF-8 آن را با دو بایت (db b5) ذخیره می‌کند. این همان مطلب درس قبل است: تعداد بایت‌ها با تعداد حرف‌ها یکی نیست، و حرف‌های غیرانگلیسی در UTF-8 بیش از یک بایت می‌گیرند. چون بایت‌ها کاملاً متفاوت‌اند، هیچ برنامه‌ای ۵ را با 5 یکی نمی‌داند.

آزمونک
  1. علامت | چه نام دارد؟

  2. چرا sleep ۵ کار نمی‌کند؟

  3. خطای «cannot access '–l'» نشانه‌ی چیست؟

  4. جداکننده‌ی مسیر در لینوکس کدام است؟

  5. امن‌ترین راه برداشتن یک دستور از یک آموزش؟

  • اسم و جای نمادهای اصلی را بدان: تیلدا ~، اسلش /، بک‌اسلش \، پایپ |، دلار $، ستاره *، کوتیشن‌ها ' و ".
  • قبل از ترمینال صفحه‌کلید را انگلیسی کن (Win+Space، Ctrl+Space، Super+Space).
  • عدد فارسی، خط‌تیره‌ی بلند، کوتیشن کج و فاصله‌ی نشکن برای چشم شبیه‌اند ولی برای کامپیوتر کاملاً متفاوت.
  • پیام خطا سرنخ می‌دهد: گزینه‌ای که اسم فایل شده، علامت‌هایی که چاپ شده‌اند، یا command not found با اسمی که فاصله دارد.
  • دستورها را از بلوک کد کپی کن یا خودت تایپ کن.
برگه‌ی تقلب این درس
دستورکاری که می‌کند
~تیلدا: پوشه‌ی خانه
/اسلش: جداکننده‌ی مسیر در لینوکس
|پایپ: خروجی به دستور بعدی
$دلار: مقدار متغیر
*ستاره: هر چیزی
' و "کوتیشن تکی و دوتایی (صاف، نه کج)
Win+Space / Ctrl+Spaceعوض کردن زبان صفحه‌کلید
echo -n "x" | od -An -tx1دیدن بایت‌های واقعی یک کاراکتر