Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

วิธีสร้าง Aliases และ Shell Functions บน Linux

การรู้จักคำสั่งพรอมต์ (command prompts) และ shell scripts ยังคงจำเป็น หากต้องการใช้ประโยชน์สูงสุดจากระบบ GNU/Linux ยิ่งทำงานบรรทัดคำสั่ง (command line) มาก ยิ่งพบว่าคำสั่งที่ใช้ส่วนใหญ่เป็น เซตย่อยเล็กๆ ของคำสั่งทั้งหมดที่มีอยู่ งานส่วนใหญ่เป็นงานซ้ำๆ และผู้ใช้มักรันคำสั่งเหล่านั้นแบบเดิมทุกวัน

แม้ผู้พัฒนาเครื่องมือคำสั่งยอดนิยมพยายามลดการพิมพ์ด้วยชื่อสั้น เช่น แทน list พิมพ์ ls แทน change-directory พิมพ์ cd นอกจากนี้ ผู้ใช้ Linux มักต้องใช้คำสั่งเดิมซ้ำๆ การพิมพ์/คัดลอกคำสั่งเดิมซ้ำๆ จะ ลดประสิทธิภาพและเบี่ยงเบนจากงานจริง

จะดีมากถ้าเราใช้เวลาพิมพ์คำสั่งยาวลดลง มี 2 วิธีอันทรงพลังในการลดเวลาบนบรรทัดคำสั่ง คือ shell aliases และ functions ด้วยทั้งสองนี้ ผู้ใช้สามารถ ควบคุมงานซ้ำๆ, ลดกระบวนการยาวๆ, และตั้งค่าคำสั่งกำหนดเองพร้อมตัวเลือกที่ใช้บ่อยและยากที่จะจำ

คุณสามารถกำหนดคำสั่งของตัวเองให้เหมาะกับความต้องการเฉพาะ และลดภาระงานซ้ำๆ

Aliases และ shell scripts (functions) ทำงานคล้ายกัน ทั้งคู่ช่วยให้คุณกำหนด — และตั้งชื่อ — ชุดฟังก์ชัน Bash shell ที่เรียกใช้ได้ด้วยชื่อที่ตั้งไว้ การพิมพ์ชื่อง่ายและสะดวกกว่าพิมพ์ขั้นตอนหรือคำสั่งทั้งหมดทุกครั้ง

ความแตกต่างระหว่าง alias และ function คือ ความซับซ้อนและขนาด Scripts เหมาะกับโค้ดยาวและซับซ้อนกว่า Aliases เหมาะกับชุดคำสั่งสั้นและกระชับ

Shell Aliases

Shell alias คือทางลัด (shortcut) ที่กำหนดเอง เพื่ออ้างอิงคำสั่งหรือชุดคำสั่งที่รันพร้อมตัวเลือกกำหนดเอง (หรือไม่มี) Aliases เป็นชื่อทางเลือกที่จดจำง่าย สำหรับคำสั่งยาวที่ต้องรันบ่อย เมื่อพิมพ์ที่บรรทัดคำสั่ง Shell จะค้นหาในรายการ aliases ก่อน หากเจอ จะแทนที่ด้วยข้อความของ alias แล้วค่อยประมวลผลคำสั่งทั้งบรรทัด

คุณอาจเคยใช้ aliases บน Linux แล้ว เพราะการกระจาย Linux ส่วนใหญ่เพิ่ม aliases ยอดนิยมไว้ในไฟล์ .bashrc ของบัญชีผู้ใช้โดยค่าเริ่มต้น

ข้าม Aliases: Shell Functions

บล็อกโค้ดที่คล้ายแต่ไม่เหมือนกัน ไม่สามารถแทนที่ด้วย Aliases ได้ Aliases ไม่จัดการ error, ไม่ส่งค่า exit code เอง, ไม่ควบคุม flow, และไม่ใช้ตัวแปรได้ หากต้องทำสิ่งเหล่านี้ จึงต้องใช้ shell functions

Shell functions เป็นบล็อกโค้ดที่โครงสร้างเป็น sub-scripts สมบูรณ์ เขียนครั้งเดียว เรียกใช้จากสคริปต์ไหนก็ได้ที่ต้องการ

ไวยากรณ์ของ Aliases:

การสร้าง aliases ใน bash ตรงไปตรงมา ไวยากรณ์:

alias alias_name="command_to_run"

เพื่อสร้าง bash alias ใหม่ในเซสชันปัจจุบัน:

  1. พิมพ์ 「alias」
  2. ตามด้วยชื่อ alias
  3. ตามด้วยเครื่องหมายเท่ากับ
  4. ตามด้วยคำสั่งที่จะรันเมื่อเรียก alias

คำสั่งต้องอยู่ในเครื่องหมายคำพูด และ ห้ามมีช่องว่างรอบเครื่องหมายเท่ากับ ช่องว่างจะทำลายคำสั่ง แต่ละ alias ต้องประกาศบรรทัดใหม่

ตัวอย่าง: คำสั่งที่ใช้บ่อยที่สุดคือ ls มักใช้กับสวิตช์ la แสดงไฟล์ทั้งหมดรวม hidden files แบบ long list เราจะสร้าง alias ll เป็นทางลัดสำหรับ ls -la

  1. เปิด terminal
  2. พิมพ์:
    alias ll="ls -la"
    แล้วกด Enter
  3. พิมพ์ ll กด Enter จะได้ผลลัพธ์เหมือน ls -la

Alias ll นี้ใช้ได้เฉพาะเซสชัน shell ปัจจุบัน หากปิดเซสชันหรือเปิดใหม่ จะหายไป

Aliases ที่กำหนดไว้ล่วงหน้า (Predefined Aliases)

บาง aliases กำหนดไว้ล่วงหน้า ใช้คำสั่ง alias โดยไม่มีพารามิเตอร์ เพื่อดูรายการทั้งหมด:

alias

นี่คือ aliases บนเครื่องทดสอบ Ubuntu Aliases ที่กำหนดเองจะแสดงในรายการนี้ด้วย

มี aliases หลายตัวสำหรับ ls และกลุ่ม aliases ให้สีสันกับคำสั่ง grep family เช่น alias ที่กำหนดข้างต้น ทุกครั้งที่พิมพ์:

grep

จะถูกตีความว่า:

grep --color=auto

นี่แสดงจุดสำคัญ: Aliases สามารถมีชื่อเดียวกับคำสั่งที่มีอยู่แล้วได้ แม้จะ包含คำสั่งเดิมภายในเองก็ได้

นี่คือการกำหนด alias grep:

alias grep='grep --color=auto'
  1. คำสั่ง alias ใช้กำหนด alias
  2. ชื่อ alias ตามมา (grep)
  3. เครื่องหมายเท่ากับเชื่อมชื่อกับ body ของ alias สำหรับ alias ที่ซับซ้อน body จะอยู่ในเครื่องหมายอิงเกลเดี่ยว
  4. Body คือส่วนที่รันเมื่อใช้ alias บนบรรทัดคำสั่ง
  5. Body นี้เพียงเรียก grep พร้อมออปชัน --color=auto

Alias Alert

ด้านบนสุดมี alias ชื่อ alert ที่ดูซับซ้อน alias นี้ใช้แจ้งเตือนเมื่อคำสั่งเสร็จสิ้น พร้อมบ่งบอกว่าสำเร็จหรือล้มเหลว แสดง system alert ที่มุมบนจอ

ตัวอย่าง: sleep 5; alert รอ 5 วินาที แล้ว alert จะตรวจสอบคำสั่งก่อนหน้า ดึงคำสั่งล่าสุดจาก history ตัดสินว่าสำเร็จหรือไม่ แสดงผลใน system alert หากสำเร็จ ไอคอนคือหน้าต่าง terminal เล็ก หากล้มเหลว ไอคอนเป็นไอคอน error สีแดง

ลองคำสั่งที่ล้มเหลวแน่นอน: DoomedToFail; alert system alert จะแสดงไอคอน error

การกำหนด Alias ง่ายๆ (Trivial Alias)

สร้าง pseudonym สำหรับคำสั่ง clear เรียกว่า cls เรียกคำสั่ง clear ไม่ซับซ้อน ไม่ต้องห่อในเครื่องหมายอิงเกลเดี่ยว หากซับซ้อนกว่านี้หรือมีช่องว่าง ให้ห่อในเครื่องหมายอิงเกลเดี่ยว กำหนด alias, 用 ls สร้าง output แล้ว用 cls เคลียร์หน้าจอ

alias cls=clear
ls -l
cls

หน้าจอถูกเคลียร์ สำเร็จ แต่ alias จะอยู่ได้แค่ตอนหน้าต่าง Terminal ยังเปิดอยู่ ปิดหน้าต่าง alias จะหาย

ทำให้ Aliases คงอยู่ถาวรด้วยไฟล์ .bashrc

Aliases ที่มากับระบบถูกกำหนดในไฟล์ .bashrc ในโฟลเดอร์ home ไฟล์นี้ถูกอ่านและรันทุกครั้งที่เริ่ม interactive shell (เปิด Terminal)

พิมพ์คำสั่งในโฟลเดอร์ home เพื่อดู .bashrc พร้อม syntax highlighting:

gedit .bashrc

จะเปิด editor gedit โหลด .bashrc แล้ว พื้นที่ไฮไลท์แสดง 2 จุดที่กำหนด aliases

เลื่อนลงจะเจอส่วนอื่น 2 ส่วนเกี่ยวกับ aliases: ส่วนแรกคือการกำหนด alert alias ส่วนที่สองคือ if statement แปลว่า 「หากไฟล์ .bash_aliases มีอยู่ ให้อ่านมันเข้ามา」

หากมี aliases น้อย ใส่ใน .bashrc ได้ วางใต้ส่วน alias ของ ls

หากจะสร้าง aliases เยอะ หรือชอบจัด aliases ไว้ในไฟล์แยก สร้างใน .bash_aliases ข้อดี: ไม่ได้เปลี่ยนแปลง settings ใน .bashrc ตรงๆ และ aliases คัดลอกไประบบใหม่ได้ง่าย เพราะแยกจาก .bashrc

ควรตั้งชื่อ alias ให้จดจำง่าย และเพิ่มคำอธิบาย (comment) ไว้อ้างอิงภายหลัง

เก็บ Aliases ในไฟล์ .bash_aliases

ไฟล์ .bash_aliases ไม่มีอยู่โดยค่าเริ่มต้น ต้องสร้างเอง:

touch .bash_aliases

แก้ไขไฟล์เพิ่ม aliases:

gedit .bash_aliases

เพิ่ม 3 aliases: cls (เคลียร์หน้าจอ), h (ย่อ history), ftc (file type count — ใช้ pipeline สร้างรายการนามสกุลไฟล์และชื่อโฟลเดอร์พร้อมจำนวน เรียงลำดับ)

หลังบันทึก .bash_aliases อาจคิดว่า aliases ทำงานได้ทันที แต่ ไม่ได้ ไฟล์ต้องถูกอ่านโดย Bash shell ก่อน (เกิดขึ้นทุกครั้งที่เปิด interactive shell) สามารถใช้คำสั่ง built-in . ของ Bash อ่านและรันคำสั่งในไฟล์ได้ เนื่องจาก .bash_aliases ถูกอ่านเมื่อ .bashrc ทำงาน เราจึงทดสอบโดยเรียก .bashrc:

gedit .bash_aliases
. .bashrc
ftc

Alias ftc ตอบสนอง แสดงว่า Bash อ่าน .bashrc และ .bash_aliases แล้ว aliases ใหม่พร้อมใช้งาน

เพิ่ม aliases ใหม่ใน .bash_aliases ได้เลย เมื่อทำซ้ำ 1-2 ครั้ง ควรสร้าง alias ไว้

การลบ Aliases (Removing Aliases)

มีคำสั่งลบ aliases เพื่อไม่ให้ Bash จดจำหรือตอบสนอง ชื่อคำสั่งคือ unalias

ใช้โดยระบุชื่อ alias ที่ต้องการลบ เช่น alias ll ก่อนหน้า:

unalias ll

ใช้ unalias ลบ aliases ที่สร้างเอง และ aliases ที่มากับระบบได้

ลบ aliases ทั้งหมด ใช้ตัวเลือก -a (all):

unalias -a

ความจดจำของ Bash จะไม่ถาวร ครั้งหน้าที่เปิด Terminal aliases ที่「ลืม」จะกลับมา หากต้องการลบถาวร ต้องลบออกจาก .bashrc และ .bash_aliases

หากคิดว่าอาจใช้ในอนาคต อย่าลบจาก .bashrc ให้ คอมเมนต์ออก โดยเพิ่ม # นำหน้าแต่ละบรรทัด alias สำหรับ .bash_aliases ให้ rename ไฟล์ หาก .bashrc มองไม่เห็น จะไม่อ่าน ถ้าต้องการคืนค่า ให้ทำย้อนกลับ

เพื่อข้าม alias ชั่วคราว (เช่น alias ls เป็น ls -a) พิมพ์:

\ls

คำสั่งเดิมจะถูกเรียก ไม่ใช่ alias

Help สำหรับคำสั่ง Alias:

  • --help option: แสดงข้อมูลช่วยเหลือ

ไวยากรณ์:

alias --help

Shell Functions

บางครั้งต้องการ alias ที่รับ arguments ได้ นั่นคือต้องใช้ bash functions

ไวยากรณ์

การสร้าง bash function ไม่ยาก สามารถประกาศได้ 2 รูปแบบ:

function_name () { [commands] }

หรือ

function function_name { [commands] }

สามารถบีบอัดรูปแบบที่ 2 เป็นบรรทัดเดียว คั่นคำสั่งด้วย semicolon ต้องมี semicolon หลังคำสั่งสุดท้ายด้วย:

function_name () { command1; command2; }

เหมือน aliases Bash shell functions สามารถกำหนดใน .bashrc ได้ แต่เนียกกว่าจะใส่ในไฟล์ definitions แยก เราจะเรียกว่า .bash_functions ตาม慣例ของ .bash_aliases

ต้องบอก .bashrc ให้อ่าน definitions ของเรา คัดลอกและแก้ไขส่วนที่อ่าน .bash_aliases เปิด gedit โหลด .bashrc:

gedit .bashrc

เพิ่มส่วนที่ไฮไลท์ ตามภาพ (คัดลอกส่วน alias กด Ctrl+C ย้ายไปวาง Ctrl+V แล้วเปลี่ยน .bash_aliases เป็น .bash_functions 2 จุด)

บันทึกปิด gedit

สร้างและแก้ไข .bash_functions ใส่ function definition:

touch .bash_functions
gedit .bash_functions

จะเปิด .bash_functions ว่างใน gedit

สร้าง function ชื่อ up รับพารามิเตอร์ 1 ตัว (ตัวเลข) เรียก cd .. จำนวนครั้งเท่าพารามิเตอร์ เช่น up 2 จะ cd .. 2 ครั้ง ย้ายขึ้น 2 ระดับในโครงสร้างไดเรกทอรี

มีหลายวิธีกำหนด function ตัวอย่าง:

function up() {

คำว่า function ไม่บังคับ ใส่ก็ได้ ไม่ใส่ก็ได้

Function ทั้งหมดใน gedit:

function up() {
  levels=$1
  while [ "$levels" -gt "0" ]; do
    cd ..
    levels=$(($levels - 1))
  done
}

levels=$1 สร้างตัวแปร levels = พารามิเตอร์ตัวแรก ($1 = พารามิเตอร์บรรทัดคำสั่งตัวแรก)

while [ "$levels" -gt "0" ]; do ลูปเมื่อค่า levels มากกว่า 0

ในลูป: cd .. (ขึ้น 1 ระดับ) และ levels=$(($levels - 1)) (ลดค่า levels ลง 1) แล้ววนลูปใหม่ จน levels ไม่มากกว่า 0

บันทึก ปิด gedit

อ่านและรันคำสั่งใน .bashrc (ซึ่งจะอ่าน .bash_functions):

. .bashrc

ทดสอบ function โดยไปที่โฟลเดอร์ลึก แล้ว用 up กลับขึ้น:

cd ./work/backup/
up 2

Function ทำงาน ย้ายขึ้น 2 ระดับ

ติดตามประเภทคำสั่งด้วย type

เมื่อ aliases และ functions เยอะขึ้น อาจจำได้ยากว่าคำสั่งไหนเป็น alias ไหนเป็น function ใช้คำสั่ง type ช่วยจำ พร้อมแสดง definition ด้วย

ลอง type กับ ftc alias และ up function:

type ftc
type up

ได้ข้อมูลประเภทคำสั่งและ definition ชัดเจน

เริ่มสะสม Aliases และ Functions

Aliases และ functions ช่วยเร่งความเร็วบนบรรทัดคำสั่งมาก ลดลำดับคำสั่ง และ埋入ตัวเลือกที่ใช้บ่อยกับคำสั่งมาตรฐาน ทุกครั้งที่เห็น one-liner น่าสนใจหรือ function มีประโยชน์ ให้ปรับแต่งและเพิ่มใน .bash_aliases หรือ .bash_functions การใช้งานอย่างกว้างขวางจะทำให้เวลาใน shell สนุกและไม่ซับซ้อน

ระวัง: การ redefine คำสั่งที่มีอยู่ด้วยพฤติกรรมที่อาจทำลายข้อมูล (แม้ alias ให้ปลอดภัยกว่า เช่น ถามยืนยันก่อนลบ recursively) อาจกลับมากัดเมื่ออยู่บนระบบที่ไม่มี alias นั้นหลังคุ้นเคยแล้ว หาตัวเลือกสร้าง aliases ให้ค้นหาจาก history คำสั่งที่ใช้บ่อยที่สุด