# Basic Commands

{% hint style="info" %}
**Useful shortcuts**
{% endhint %}

<table><thead><tr><th width="150">Shortcut</th><th>คำอธิบาย</th></tr></thead><tbody><tr><td>Ctrl + A</td><td>ย้าย cursor ไปที่ต้นบรรทัด</td></tr><tr><td>Ctrl + E</td><td>ย้าย cursor ไปที่ปลายบรรทัด</td></tr><tr><td>Alt + F</td><td>ขยับ cursor ไปข้างหน้าโดยข้ามไปทีละคำ (word)</td></tr><tr><td>Alt + B</td><td>ขยับ cursor ถอยหลังโดยข้ามไปทีละคำ (word)</td></tr><tr><td>Ctrl + L</td><td>ล้างหน้าจอ terminal คล้ายกับคำสั่ง <code>clear</code></td></tr><tr><td>Ctrl + R</td><td>ค้นหาคำสั่งที่เคยพิมพ์มาก่อนหน้านี้</td></tr><tr><td>Ctrl + C</td><td>หยุดการทำงานของโปรแกรม</td></tr><tr><td>Ctrl + D</td><td>logout หรือออกจากคำสั่งที่กำลังทำงานอยู่</td></tr><tr><td>Ctrl + Z</td><td>หยุดพักคำสั่งชั่วคราว</td></tr></tbody></table>

{% hint style="info" %}
**Basic Commands**
{% endhint %}

<table><thead><tr><th width="129.33333333333331">ชุดคำสั่ง </th><th>                       คำอธิบาย </th><th>                     ตัวอย่าง </th></tr></thead><tbody><tr><td>mkdir </td><td>ใช้สร้างไดเรกทอรี่ใหม่  </td><td><p>mkdir (ชื่อไดเรกทอรี่) </p><p>เช่น <code>mkdir test1</code> </p></td></tr><tr><td>cd </td><td>การเข้าสู่ไดเรกทอรี่ที่ต้องการ </td><td><p>cd (ไดเรกทอรี่ที่ต้องการเข้า) </p><p>เช่น <code>cd test1</code></p></td></tr><tr><td>touch</td><td>ใช้สร้างไฟล์ หรืออัพเดตเวลาการแก้ไขไฟล์ล่าสุด</td><td>touch test.txt<br><code>touch -m test.txt</code> </td></tr><tr><td>ls </td><td>แสดงไฟล์ที่อยู่ในไดเรกทอรี่ </td><td><code>ls</code> </td></tr><tr><td>cp </td><td><p>เป็นคำสั่งที่ใช้ในการคัดลอกไฟล์ </p><p>(ทั้งไฟล์เดียวและหลายไฟล์) </p><p>โดยระบุ source และ target </p></td><td><p>cp (ชื่อไฟล์) (ที่อยู่ที่ต้องการคัดลอกไฟล์ไปไว้) </p><p>เช่น <code>cp test.txt test1</code><br>คือการ copy file ชื่อ test.txt ไปไว้ในไดเรกทอรี่ test1    </p></td></tr><tr><td>mv </td><td><p>เป็นคำสั่งที่ใช้ในการโยกย้ายไฟล์<br><br>หรือ<br></p><p>เปลี่ยนชื่อไฟล์ </p></td><td><p>mv (ชื่อไดเรกทอรี่เดิม) (ชื่อไดเรกทอรี่ใหม่ที่ต้องการย้ายไป) </p><p><code>mv file.txt /test1</code><br><br>เปลี่ยนชื่อไฟล์ mv (ชื่อเก่า) (ชื่อใหม่)<br><code>mv file.txt newfile.txt</code></p></td></tr><tr><td>rm  </td><td><p>ใช้ในการลบไฟล์โดยสามารถใช้ได้ทั้ง</p><p>ไฟล์เดียวหรือหลายไฟล์ </p></td><td><p>rm (ตามด้วยชื่อไฟล์ที่ต้องการลบ) </p><p><code>rm test1.txt</code> </p></td></tr><tr><td>rmdir </td><td><p>ใช้ลบไดเรกทอรี่ ซึ่งสามารถลบได้</p><p>เฉพาะไดเรกทอรีว่างเท่านั้น </p></td><td><code>rmdir directory_name</code> </td></tr><tr><td>echo </td><td><p>เป็นคำสั่งที่ใช้ในการแสดงข้อความใดๆ</p><p>ที่ต้องการให้ถูกปรากฏบนหน้าต่างเทอร์มินัล <br>หรือสามารถใช้แทรกข้อความลงในไฟล์ได้</p></td><td><p>echo (ข้อความที่ต้องการแสดง) </p><p><code>echo Hello</code> <br><br><code>echo this is message >> test.txt</code></p></td></tr><tr><td>cat </td><td><p>ใช้แสดงข้อมูลที่อยู่ในไฟล์ออกมา</p><p>แสดงครั้งเดียวพร้อมกันทั้งหมด  ในบางครั้งก็</p><p> ใช้ในการรวมไฟล์หลายไฟล์เข้าด้วยกันมา</p><p>เป็นไฟล์เดียว และสามารถใช้สร้างไฟล์ </p></td><td><p>cat (ไฟล์.txt) </p><p>เช่น <code>cat test.txt</code> </p></td></tr><tr><td>clear</td><td>ล้าง terminal ให้อยู่ใน init state</td><td><code>clear</code></td></tr><tr><td>df </td><td><p>แสดง ผลได้ทั้งจำนวนพื้นที่ที่มีการใช้งาน</p><p>ไปแล้วในระบบ และพื้นที่ว่างที่สามารถใช้งาน </p></td><td><code>df -h</code></td></tr><tr><td>du </td><td><p>คำสั่งที่ใช้ในการตรวจสอบขนาดการใช้งาน</p><p>ไดเรกทอรีที่ชี้อยู่ (mount point) รวมถึง</p><p> ไดเรกทอรีย่อยๆลงไปจากตำแหน่งปัจจุบัน </p></td><td><code>du -h</code></td></tr><tr><td>pwd </td><td>แสดงไดเรกทอรี่ที่กำลังใช้งาน </td><td><code>pwd</code> </td></tr><tr><td>ifconfig </td><td><p>ตรวจสอบว่ากำลังใช้ Network Interface</p><p> Card (NIC) หมายเลขตัวใดอยู่ เช่น eth0 </p><p>หรือ eth1 เป็นต้น</p></td><td><code>ifconfig</code> </td></tr><tr><td>tar </td><td><p>ใช้สำหรับแตกไฟล์นามสกุล tar </p><p>และบีบอัดไฟล์หรือไดเรกทอรี่ให้เป็น</p><p>ไฟล์นามสกุล tar </p></td><td><p>tar cvf (ชื่อไฟล์.tar) (ไดเรกทอรี่หรือไฟล์ที่ต้องการบีบอัด) </p><p>เช่น <code>tar cvf test1.tar test1</code> </p><p>คำสั่งแตกไฟล์ tar </p><p><code>tar xvf test1.tar</code> </p></td></tr><tr><td>chmod </td><td><p>การกำหนดสิทธิ์ในการเข้าถึงไฟล์</p><p>โดยแบ่งสิทธิ์ไว้ 3 กลุ่มคือ Owner Group</p><p> publie ซึ่งจะแทนตัวเลข 0-7 ในการกำหนด</p><p>สิทธิ์ของแต่ละกลุ่ม เช่น  644 (เลขฐานแปด)หรือเทียบเท่ากับ rw-r--r-- หมายถึง เจ้าของอ่านและเขียนได้ แต่คนอื่น</p><p>ทั่วไปอ่านได้อย่างเดียว </p></td><td><p>chmod (กำหนดสิทธิ์การเข้าถึง) (ชื่อไฟล์) </p><p>เช่น <code>chmod 644 test</code> </p></td></tr><tr><td>uname </td><td>แสดงชื่อของระบบปฏิบัติการที่ใช้งานอยู่ </td><td><code>uname -a</code></td></tr><tr><td>ps aux </td><td><p>ใช้แสดงรายการประมวลผลต่างที่กำลัง</p><p>ทำงานอยู่ของระบบแบบระเอียด </p></td><td><code>ps aux</code> </td></tr><tr><td>kill </td><td><p>การส่งสัญญาณเข้าไปขัดจังหวะโปรเซส</p><p> เพื่อบอกกับโปรเซสตามวัตถุประสงค์ของสัญญาณ้ส่งไป สามารถดูตัวเลข  process </p><p>ได้จาก คำสั่ง kill -l </p></td><td><p>kill (ตัวเลข process) (PID) </p><p>เช่น <code>kill –9 203</code> </p></td></tr><tr><td>zip </td><td>ใช้บีบอัดไฟล์เป็นนามสกุล zip </td><td><p>zip (ชื่อไฟล์.zip) ไฟล์ที่ต้องการzip  </p><p> เช่น <code>zip test.zip test</code> </p></td></tr><tr><td>unzip </td><td>ใช้แตกไฟล์นามสกุล zip </td><td><p>unzip (ไฟล์.zip) </p><p>เช่น <code>unzip test.zip</code> </p></td></tr><tr><td>sudo su </td><td><p>ใช้เมื่อผู้ใช้ต้องการเข้าในฐานะผู้ดูแลระบบ</p><p>ที่เรียกว่า Superuser หรือ root </p></td><td><code>sudo su</code> </td></tr></tbody></table>

### *Command Sequences*

ผู้ใช้สามารถป้อนคำสั่งมากกว่าหนึ่งคำสั่งไปพร้อมกันโดยใช้ตัวดำเนินการควบคุม (Control Operators) ได้แก่ `||` `&&` `&` `;` `;;` `|` `(` `)` เป็นต้น ซึ่งการเรียงชุดคำสั่งอย่างง่ายที่สุดในกรณีที่มีมากกว่า 1 คำสั่งเป็นต้นไป จะใช้เครื่องหมาย `;` อัฒภาค (semicolon) shell จะรับคำสั่งและดำเนินการทีละคำสั่งตามลำดับ ในกรณีที่จะมีการตรวจสอบผลลัพธ์การทำงานของแต่ละคำสั่งว่าสำเร็จหรือล้มเหลวนั้น ระบบปฏิบัติการลีนุกซ์จะมีการคืนค่ากลับคือถ้าคืนค่ากลับมาเลขศูนย์จะหมายถึงคำสั่งดำเนินการสำเร็จ แต่ถ้าเป็นตัวเลขอื่นๆจะถือว่าคำสั่งนั้นทำงานล้มเหลว ดังนั้นผู้ใช้สามารถกำหนดเส้นทางการทำงานตามเงื่อนไขที่ออกมาโดยใช้ตัวดำเนินการ AND `&&` และ OR `||` ตัวอย่างเช่น&#x20;

```shell-session
$ ls
android  ccache     Downloads  kernel   output.txt  Templates  workspace
aosp     Desktop    error.log  Music    Pictures    test.txt
bin      Documents  git        one.txt  Public      Videos

$ ls test.txt && echo "OK... File exists"
test.txt
OK... File exists

$ ls mail.txt && echo "OK... File exists"
ls: cannot access mail.txt: No such file or directory
```

จากคำสั่งข้างต้น ไฟล์ test.txt มีอยู่ในไดเรกทอรีจึงทำให้ระบบปฏิบัติการลีนุกซ์คืนค่ากลับมาเป็นศูนย์ คำสั่งถัดไปจึงทำงานต่อได้ แต่ในขณะที่ไฟล์ mail.txt ไม่ได้อยู่ในไดเรกทอรี แสดงถึงการทำงานล้มเหลว ทำให้ไม่มีการทำคำสั่งตัวถัดไป แต่หากใช้ตัวดำเนินการ `||` คำสั่งถัดมาจะถูกทำงานในกรณีที่คำสั่งแรกมีการคืนค่ากลับมาไม่เท่ากับศูนย์ ดังตัวอย่างข้างล่าง

<pre class="language-shell-session"><code class="lang-shell-session">$ ls test.txt || echo "OK... File exists"
test.txt
<strong>
</strong><strong>$ ls mail.txt || echo "No File exists"
</strong>ls: cannot access mail.txt: No such file or directory
ON File exists
</code></pre>

แต่หากต้องการนำตัวดำเนินการ && และ || มาประยุกต์ใช้ในการตรวจสอบเงื่อนไขเหมือนชุดคำสั่ง if (เงื่อนไข) *..(จริง)..* else *..(เท็จ)..* หรือ if (เงื่อนไข) ? *..(จริง)..* : *..(เท็จ)..* ในภาษาโปรแกรมทั่วไป จะมีรูปแบบการเขียนดังนี้

```shell-session
$ ls test.txt && echo "OK...File exists" || echo "Oh Bad... File not found"
test.txt
OK...File exists

$ ls mail.txt && echo "OK...File exists" || echo "Oh Bad... File not found"
ls: cannot access mail.txt: No such file or directory
Oh Bad... File not found
```

### *Standard I/O*

รายละเอียดขบวนการทำงานของ Shell ในระบบปฏิบัติการลีนุกซ์ จะมีพื้นฐานสำคัญคือ วิธีการเชื่อมต่อระหว่างโปรแกรมและสิ่งแวดล้อมของตัวโปรแกรมเองภายในเทอร์มินัล (Terminal) ที่เรียกว่า I/O ซึ่งรูปข้างล่างนี้เป็นการแสดงการเชื่อมต่อของอุปกรณ์ I/O มาตราฐานพื้นฐานของระบบที่มีอยู่ 3 ชนิด ได้แก่ &#x20;

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2F3VcmualEl94K2ORqJoti%2FstandardIO.png?alt=media&#x26;token=7329f833-aac5-4cf2-b0f7-df0da535564b" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
ตารางรายละเอียดพื้นฐานของ Standard I/O
{% endhint %}

<table><thead><tr><th width="283.3333333333333">Stream มาตราฐาน</th><th width="70">FD</th><th>รายละเอียด</th></tr></thead><tbody><tr><td>stdin (Standard Input Stream)</td><td>0</td><td>สำหรับรับคำสั่งจากผู้ใช้เพื่อส่งต่อให้โปรแกรม อาทิเช่นการรับข้อมูลคำสั่งจากการกดคีย์บอร์ด</td></tr><tr><td>stdout (Standard Output)</td><td>1</td><td>สำหรับแสดงผลลัพธ์ที่ถูกส่งออกมาจากโปรแกรม เพื่อส่งข้อความผลลัพธ์ออกมาแสดงบนจอภาพ</td></tr><tr><td>stderr (Standard Error)</td><td>2</td><td>สำหรับแสดงผลความผิดพลาดเกิดจากการทำงานของโปรแกรมที่รับคำสั่งมาประมวลผล ออกจากหน้าจอภาพ</td></tr></tbody></table>

### *Redirections*

ระบบปฏิบัติการลีนุกซ์นั้นได้เตรียมเครื่องมือตัวดำเนินการที่สามารถควบคุมกลไกการไหลของข้อมูลจากทิศทางหนึ่งไปยังอีกทิศทางหนึ่งหรืออธิบายง่ายๆคือการเปลี่ยนเส้นทางข้อมูลว่าจะให้ออกตัว standard stream ตัวใด โดยการใช้ตัวดำเนินการ `<` แทน stdin (Standard Input) และ `>` แทน stdout (Standard Output) ซึ่งตัวดำเนินการ redirection นั้นมีอยู่ด้วยกัน 5 แบบตามรายละเอียดในตารางข้างล่าง

{% hint style="info" %}
ตารางตัวดำเนินการ redirection
{% endhint %}

<table><thead><tr><th width="185">ตัวดำเนินการ</th><th>รายละเอียด</th></tr></thead><tbody><tr><td>&#x3C;  <em>ไฟล์</em></td><td>เปิดไฟล์สำหรับอ่านข้อมูลภายในไฟล์</td></tr><tr><td>&#x3C;&#x3C;  <em>token</em></td><td>ใช้ในกรณีที่เป็นคำสั่งหรือเชลล์สคริปท์ที่ต้องการรับค่าจนกระทั่งเจอ token</td></tr><tr><td>> <em>ไฟล์</em></td><td>เปิดไฟล์สำหรับเขียนทับข้อมูลใหม่</td></tr><tr><td>>> <em>ไฟล์</em></td><td>เปิดไฟล์สำหรับเขียนต่อท้ายจากข้อมูลเดิม</td></tr><tr><td><em>n</em>>&#x26;<em>m</em></td><td>เปลี่ยนเส้นทางของ File Descriptor (FD) เดิม n ไปที่ใหม่ m</td></tr></tbody></table>

ยกตัวอย่างเช่น การใช้งานการส่งอินพุทจากไฟล์ /etc/passwd ให้กับคำสั่ง grep และการส่งอินพุทจากการป้อนข้อความให้กับคำสั่ง sort ดังแสดงข้างล่าง&#x20;

```shell-session
$ grep -i student < /etc/passwd
student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash

$ sort << END
> 55233424 Wiroon Sriborrirux
> 55237346 Nayot Kurukitkoson
> 55236477 Panuwat Dankhang
> END
55233424 Wiroon Sriborrirux
55236477 Panuwat Dankhang
55237346 Nayot Kurukitkoson
$ sort -k2 << END
> 55233424 Wiroon Sriborrirux
> 55237346 Nayot Kurukitkoson
> 55236477 Panuwat Dankhang
> END
55237346 Nayot Kurukitkoson
55236477 Panuwat Dankhang
55233424 Wiroon Sriborrirux
```

เมื่อมีการใช้ตัวดำเนินการ `>` ผลลัพธ์จากคำสั่งจะถูกส่งไปเก็บไว้ในไฟล์ /tmp/results แทนที่จะออกหน้าจอ ดังตัวอย่างข้างล่าง

```shell-session
$ grep -i student /etc/passwd > /tmp/results

$ ls /tmp/
CRX_75DAF8CB7768    orbit-student       ssh-pqdoFN1336  vmware-root-2
hsperfdata_student  pulse-Xti8iSZ9STOh  VMwareDnD       vmware-student
keyring-27UIsq      results             vmware-root

$ cat /tmp/results 
student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash
```

ตัวอย่างการใช้คำสั่ง cat เพื่อแสดงข้อมูลภายในไฟล์ จะมีการแสดงข้อความผิดพลาด (Error message) ออกทางหน้าจอ ถ้าไฟล์นั้นไม่มีอยู่ในไดเรกทอรี

```shell-session
$ cat one.txt two.txt 2>&1
This is the data inside
cat: two.txt: No such file or directory
```

สามารถกรองข้อความผิดพลาดให้ไปเก็บไว้ในไฟล์ชื่อ error.log ด้วยตัวดำเนินการ `2>`

```shell-session
$ cat one.txt two.txt 2> error.log
This is the data inside
```

ในกรณีที่ไม่ต้องการเก็บข้อความผิดพลาด สามารถทำได้โดยส่งไปให้ไฟล์ชื่อ /dev/null

```shell-session
$ cat one.txt two.txt 2> /dev/null
This is the data inside
```

บันทึกข้อความผิดพลาดเพิ่มต่อเข้าไปในไฟล์ error.log ด้วยตัวดำเนินการ `2>>`&#x20;

```shell-session
$ cat one.txt two.txt three.txt 2>> error.log
This is the data inside

$ cat error.log 
cat: two.txt: No such file or directory
cat: two.txt: No such file or directory
cat: three.txt: No such file or directory
```

*Last updated: July 2023*

> Authors:
>
> * Assoc. Prof. Wiroon Sriborrirux
> * Thanaluk Pranekunakol (AIC-Researcher), Waratith Sawangboon (AIC-Researcher)
