Contents

Zsh กับ Bash Scripting ความแตกต่างคืออะไร?

เมื่อพูดถึงเชลล์สคริปต์บนระบบปฏิบัติการที่เหมือน Unix เชลล์สองตัวจะมีอิทธิพลเหนือ: Bash (Bourne Again Shell) และ Zsh (Z Shell) หากคุณเป็นโปรแกรมเมอร์หรือผู้ดูแลระบบ ตัวเลือกระหว่างสองสิ่งนี้จะส่งผลต่อประสิทธิภาพและประสิทธิผลของคุณอย่างมาก

การทำความเข้าใจความแตกต่างและความคล้ายคลึงระหว่างเชลล์ทั้งสองนี้จะเป็นประโยชน์ในการเพิ่มประสิทธิภาพกระบวนการทำงานของบรรทัดคำสั่ง เนื่องจากการมีความรู้เกี่ยวกับคุณลักษณะเฉพาะของเชลล์ทั้งสองนี้ทำให้สามารถตัดสินใจได้อย่างมีข้อมูลครบถ้วน

Bash และ Zsh คืออะไร?

Bash เป็นอินเทอร์เฟซบรรทัดคำสั่งที่หลากหลายและใช้กันอย่างแพร่หลาย นำเสนอฟังก์ชันการทำงานที่หลากหลายบนแพลตฟอร์มต่างๆ เช่น ระบบ Linux และ macOS ในฐานะเครื่องมือที่แข็งแกร่งและมีประสิทธิภาพ ช่วยให้ผู้ใช้สามารถโต้ตอบกับระบบปฏิบัติการได้อย่างราบรื่นในขณะที่ดำเนินการหลายคำสั่งพร้อมกัน นอกจากนี้ ความสามารถของ Bash ยังขยายไปไกลกว่าการโต้ตอบขั้นพื้นฐานผ่านการรองรับเชลล์สคริปต์ ด้วยการใช้สคริปต์ที่ประกอบด้วยหลายคำสั่ง ผู้ใช้จึงสามารถทำงานที่ซ้ำหรือใช้เวลานานโดยอัตโนมัติได้อย่างมีประสิทธิภาพ จึงทำให้กระบวนการเวิร์กโฟลว์คล่องตัวขึ้น

ด้วยการรวมองค์ประกอบจากทั้งระบบปฏิบัติการ Mac และ Linux ทำให้ Zsh เป็นอินเทอร์เฟซบรรทัดคำสั่งที่หลากหลายและมีฟีเจอร์มากมาย ซึ่งทำหน้าที่เป็นเชลล์มาตรฐานสำหรับแพลตฟอร์ม macOS ของ Apple ในขณะเดียวกันก็ได้รับความสนใจจาก Linux ต่างๆ มากมายไปพร้อมๆ กัน

วิธีเปลี่ยนจาก Bash เป็น Zsh

หากต้องการเปลี่ยนจากการใช้ระบบปฏิบัติการ Linux ไปเป็นการใช้ Zsh เป็นเชลล์เริ่มต้นของคุณได้อย่างราบรื่น ให้เริ่มต้นด้วยการใช้ตัวจัดการแพ็คเกจของการแจกจ่ายของคุณเพื่อวัตถุประสงค์ในการติดตั้ง ตามภาพประกอบ หากคุณกำลังทำงานกับระบบที่ใช้ Debian หรือ Ubuntu ให้ดำเนินการคำสั่งต่อไปนี้:

 sudo apt install zsh 

หลังจากที่คุณติดตั้งโปรแกรมบนคอมพิวเตอร์ของคุณแล้ว คุณสามารถสลับไปใช้โปรแกรมดังกล่าวได้อย่างง่ายดายโดยดำเนินการคำสั่งเฉพาะในเทอร์มินัลหรือพร้อมท์คำสั่งของคุณ

 chsh -s $(which zsh) 

หากต้องการเปลี่ยนไปใช้เชลล์ Zsh บนระบบปฏิบัติการ Mac ให้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

 chsh -s /bin/zsh 

หากต้องการเปลี่ยนกลับไปใช้ Bash เชลล์แทน Zsh เพียงแก้ไขคำสั่งที่ให้ไว้ก่อนหน้านี้โดยแทนที่"Zsh"ด้วย"Bash"

หากต้องการตรวจสอบเชลล์ปัจจุบันที่ใช้ ให้ดำเนินการตามคำสั่งต่อไปนี้:

 echo $SHELL 

การรวมการใช้มาตรการยืนยันสามารถช่วยในการตรวจสอบได้ว่าผู้ใช้ใช้สภาพแวดล้อมการปฏิบัติงานที่ต้องการ ซึ่งจะช่วยส่งเสริมความมั่นใจมากขึ้นเกี่ยวกับการเลือกที่ทำขึ้น

ความแตกต่างระหว่าง Zsh และ Bash

การตรวจสอบความแตกต่างระหว่าง Zsh และ Bash ถือเป็นสิ่งสำคัญในการพิจารณาว่าเชลล์ใดที่สอดคล้องกับความต้องการและความต้องการของคุณ

การปรับแต่งที่รวดเร็ว

Zsh มอบวิธีที่สะดวกในการปรับแต่งอินเทอร์เฟซบรรทัดคำสั่งของคุณโดยใช้ลำดับการหลีกเลี่ยงแบบเปอร์เซ็นต์ภายในพรอมต์หลัก ซึ่งแสดงเป็น PS1 ด้วยการใช้วิธีการนี้ จึงเป็นไปได้ที่จะสร้างข้อความแจ้งที่ดึงดูดสายตาและให้ข้อมูลซึ่งรวมเอาองค์ประกอบต่างๆ เช่น สีและเนื้อหาที่สร้างขึ้นแบบไดนามิก เพื่อปรับแต่งรูปลักษณ์ของพรอมต์เชลล์ของคุณ คุณต้องสร้างการกำหนดค่าที่ต้องการก่อนโดยการกำหนดตัวแปร PS1

 PS1="%F{green}%n@%m %F{blue}%~ %f$ "

พรอมต์แบบกำหนดเองที่กล่าวมาข้างต้นจะแสดงชื่อเล่น ชื่อโดเมน และไดเร็กทอรีการทำงานปัจจุบันของผู้ใช้ผ่านตัวบ่งชี้ภาพที่มีเฉดสีหลากหลาย:

/th/images/what-is-the-difference-zsh-vs-bash-scripting-in-the-terminal-prompt-customization.jpg

มีหลายวิธีในการปรับแต่งพรอมต์ Zsh ในแบบของคุณ ซึ่งช่วยให้สามารถแสดงตัวบ่งชี้ด้านการดูแลระบบ รวมวันที่และเวลาปัจจุบัน และรักษาการแก้ไขใด ๆ ที่ทำกับพรอมต์ที่อัปเดต

Bash ใช้กลยุทธ์ทางเลือกเพื่อการปรับเปลี่ยนในแบบของคุณอย่างรวดเร็วเมื่อเทียบกับ Zsh การใช้รหัส Escape ช่วยให้สามารถปรับแต่งสีและรูปแบบภายในข้อความแจ้งได้ เพื่อให้ได้ระดับการตัดเย็บที่ใกล้เคียงกับตัวอย่างของ Zsh เราอาจใช้เทมเพลตพร้อมท์ที่กำหนดเองในภายหลัง:

 PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "

การใช้ \\[\033[0m\\] เป็นสิ่งจำเป็น เนื่องจากรับประกันได้ว่าการแก้ไขสีจะไม่ส่งผลกระทบต่อข้อความที่ตามมาภายในคำสั่งหรือข้อความ

รองรับอาร์เรย์แบบเชื่อมโยง

Zsh ซึ่งเป็นภาษาพื้นเมืองของการเขียนโปรแกรมในระบบที่คล้ายกับ Unix ยอมรับแนวคิดของอาร์เรย์ที่เชื่อมโยงโดยเนื้อแท้ อาร์เรย์แบบเชื่อมโยงคือชุดของคู่คีย์-ค่าที่อำนวยความสะดวกในการจัดระเบียบและการดึงข้อมูลอย่างง่ายดายสูงสุด ในการสร้างอาเรย์แบบเชื่อมโยง เราสามารถใช้คีย์เวิร์ด “ประกาศ” ตามด้วย “-A” เพื่อประกาศการมีอยู่ของมันอย่างชัดเจน

 # Declare an associative array in Zsh
 declare -A my_assoc_array 

เราอาจฝังอาร์เรย์ที่เชื่อมโยงด้วยค่าที่กำหนดหลังจากนั้น

 my_assoc_array=(key1 value1 key2 value2)

ในการดึงค่าที่เกี่ยวข้องกับคีย์ของพจนานุกรม เราสามารถใช้การจัดทำดัชนีเพื่ออ้างอิงและเข้าถึงค่าเหล่านั้นได้โดยตรง กระบวนการนี้เกี่ยวข้องกับการระบุคีย์ที่สนใจและใช้เป็นดัชนีเพื่อให้ได้ค่าที่สอดคล้องกันภายในพจนานุกรม

 echo $my_assoc_array[key1] # Outputs: value1 

Bash ให้การสนับสนุนแบบเนทิฟสำหรับอาร์เรย์ที่เชื่อมโยงตั้งแต่เวอร์ชัน 4 กระบวนการประกาศและการกำหนดค่าจะคล้ายกับกระบวนการใน Zsh อย่างไรก็ตาม เมื่อพูดถึงการดึงข้อมูลองค์ประกอบอาร์เรย์ เราจะต้องใส่ดัชนีไว้ในเครื่องหมายปีกกา {}

 echo "${my_assoc_array[key1]}"

ความแตกต่างที่โดดเด่นประการหนึ่งระหว่าง Zsh และ Bash อยู่ที่ความสามารถตามลำดับเกี่ยวกับอาร์เรย์ที่เชื่อมโยง แม้ว่าเชลล์ทั้งสองจะมีฟังก์ชันดังกล่าว แต่ Zsh ก็มีชุดคุณลักษณะที่ครอบคลุมมากขึ้นสำหรับโครงสร้างข้อมูลเหล่านี้ โดยเฉพาะอย่างยิ่ง Zsh อนุญาตให้ใช้อาร์เรย์ที่เกี่ยวข้องกับค่าคีย์ของประเภทข้อมูลที่หลากหลาย นอกเหนือจากสตริงข้อความธรรมดา ในขณะที่ Bash จำกัดคีย์ให้ประกอบด้วยองค์ประกอบสตริงเท่านั้น

ในการทำซ้ำภาษาการเขียนโปรแกรม Bash ก่อนหน้านี้ การใช้อาเรย์แบบเชื่อมโยงจำเป็นต้องมีการดำเนินการแก้ไขปัญหาชั่วคราวหรือการใช้เครื่องมือภายนอก

รูปแบบ Globbing แบบขยาย

รูปแบบทรงกลมแบบขยายนำเสนอวิธีการที่แข็งแกร่งและหลากหลายสำหรับการเลือกและจัดการไฟล์และไดเร็กทอรีตามเกณฑ์หลายเกณฑ์ ทำให้มีประโยชน์อย่างยิ่งในสถานการณ์ที่เกี่ยวข้องกับโครงสร้างไดเร็กทอรีที่ซับซ้อนหรือความต้องการระดับรายละเอียดในการเลือกไฟล์

เพื่อเปิดใช้งานเกณฑ์การจับคู่รูปแบบเฉพาะภายในสคริปต์ Zsh โดยใช้คำสั่ง setopt เราสามารถระบุนามสกุลไฟล์เฉพาะที่น่าสนใจสำหรับไดเร็กทอรีการทำงานปัจจุบัน เพื่อให้บรรลุวัตถุประสงค์นี้ เพียงดำเนินการคำสั่ง setopt ตามด้วยนามสกุลไฟล์ที่ต้องการ เช่น .txt ซึ่งจะทำให้สามารถจดจำและประมวลผลไฟล์ข้อความด้วยส่วนต่อท้ายนั้นภายในบริบทไดเร็กทอรีปัจจุบัน

 setopt extended_glob
txt_files=(*.txt)

“.jpg-ไม่ใช่ *.log” การดำเนินการนี้จะเลือกไฟล์ทั้งหมดที่มีนามสกุลไฟล์ “.jpg” หรือ “.jpeg” และไม่มีนามสกุล “.log” ที่ตรงกัน

 setopt extended_glob
non_log_files=^(*.log)

ในการใช้รูปแบบวงกลมแบบขยายภายใน Bash เชลล์ เราจะต้องเปิดใช้งานคุณสมบัตินี้โดยใช้คำสั่ง “shopt” ควบคู่ไปกับตัวเลือก “extglob” เพื่อแสดงให้เห็น หากต้องการระบุและประมวลผลไฟล์ทั้งหมดที่ลงท้ายด้วย “.txt” ซึ่งอยู่ในไดเร็กทอรีการทำงานปัจจุบัน จะต้องป้อนรหัสต่อไปนี้:

 shopt -s extglob
txt_files=(*.txt)

หากต้องการแยกไฟล์ที่มีนามสกุลไฟล์ “.log” ไม่ให้ตรงกัน คุณสามารถใช้รูปแบบนิพจน์ทั่วไปต่อไปนี้ในคำสั่ง grep ของคุณ:css[^.]\*\.log$This จะค้นหาสตริงใดๆ ที่ไม่ตรงกัน เริ่มต้นด้วยจุด (เช่น ไม่ใช่ชื่อไฟล์ที่ลงท้ายด้วย “.log”) ตามด้วย “\.log” ซึ่งจะจับคู่สตริงย่อยของอักขระที่ลงท้ายด้วย “.log” ซึ่งควรรวมไฟล์บันทึกส่วนใหญ่ แต่ไม่รวมไฟล์ข้อความหรือไดเร็กทอรีประเภทอื่น

 shopt -s extglob
non_log_files=!(*.log) 

ในแง่ของการจับคู่รูปแบบ glob มีความแตกต่างที่สำคัญระหว่าง Zsh และ Bash ที่เกี่ยวข้องกับคำสั่งที่เกี่ยวข้องที่ใช้ในการเปิดใช้งานรูปแบบเหล่านี้ อย่างไรก็ตาม ควรสังเกตว่าตัวดำเนินการบางอย่างที่ใช้โดยแต่ละกระสุนอาจแตกต่างกันไป

การขยายพารามิเตอร์ขั้นสูง

Zsh นำเสนอความสามารถในการขยายพารามิเตอร์ทางอ้อม ซึ่งช่วยให้สามารถประเมินตัวแปรที่มีชื่ออยู่ในตัวแปรอื่นได้ เพื่อดำเนินการนี้ จำเป็นต้องใส่เครื่องหมายอัศเจรีย์นำหน้าชื่อตัวแปร ซึ่งแสดงด้วย"!"

 name="foo"
result="${!name}"
echo "$result"

Bash ไม่รองรับการขยายตัวแปรทางอ้อมโดยเนื้อแท้ อย่างไรก็ตาม มีวิธีแก้ไขชั่วคราวที่สามารถใช้ได้ เช่น การใช้คำสั่งในตัว eval หรือใช้ไวยากรณ์ ${!variable} เพื่อให้เกิดการอ้างอิงตัวแปรทางอ้อม

 name="world"
var="name"
echo ${!var} # This will output: world

ความคล้ายคลึงกันระหว่าง Bash และ Zsh

แม้จะมีความแตกต่างระหว่าง Bash และ Zsh แต่ความเหมือนกันบางอย่างก็สามารถสังเกตได้ระหว่างกันเช่นกัน

ไวยากรณ์บรรทัดคำสั่ง

Bash และ Zsh ใช้โครงสร้างที่คล้ายคลึงกันสำหรับอินเทอร์เฟซบรรทัดคำสั่ง ซึ่งอำนวยความสะดวกในการทำงานร่วมกันอย่างราบรื่นระหว่างกัน ด้วยเหตุนี้ คำสั่งและลำดับสคริปต์ส่วนใหญ่จึงสามารถดำเนินการได้ในทั้งสองเชลล์โดยไม่จำเป็นต้องปรับเปลี่ยน ความจริงที่ว่า Zsh ถูกสร้างขึ้นบนพื้นฐานของ Bash หมายความว่ามันรวมเอาความสามารถและฟังก์ชันพื้นฐานทั้งหมดเข้าด้วยกัน

แม้ว่าโครงสร้างทางไวยากรณ์อาจมีความคลาดเคลื่อนเล็กน้อยที่ต้องให้ความสนใจ แต่สิ่งสำคัญคือต้องพิจารณาอย่างรอบคอบและแก้ไขตามนั้น

ความสอดคล้องของการทดแทนคำสั่ง

การทดแทนคำสั่งเป็นเทคนิคที่ใช้ในการดำเนินการคำสั่งโดยที่ผลลัพธ์หรือเอาต์พุตของคำสั่งหนึ่งถูกรวมเป็นอาร์กิวเมนต์ภายในคำสั่งอื่น เพื่อให้มั่นใจถึงความสม่ำเสมอในสภาพแวดล้อมเชลล์ที่แตกต่างกัน

 result=$(ls)

ทั้ง Bash และ Zsh มีฟังก์ชันการทำงานที่คล้ายกันโดยอนุญาตให้ใช้ไวยากรณ์ $(command) ซึ่งช่วยให้สามารถทดแทนเอาต์พุตจากคำสั่งไปเป็นตัวแปรได้ คุณลักษณะนี้อำนวยความสะดวกในการทำงานร่วมกันได้อย่างราบรื่นระหว่างเชลล์ทั้งสองประเภท ในขณะที่ยังคงความเข้ากันได้ของสคริปต์บนแพลตฟอร์มที่แตกต่างกัน

ตัวเลือกการดีบักสคริปต์

ทั้ง Bash และ Zsh ใช้แฟล็ก -x เพื่ออำนวยความสะดวกในการดีบักสคริปต์ ด้วยการรันสคริปต์โดยใช้แฟล็กนี้ สคริปต์จะแสดงแต่ละคำสั่งก่อนดำเนินการ สิ่งนี้ทำให้ผู้ใช้สามารถตรวจจับความคลาดเคลื่อนภายในสคริปต์ของตนได้

 # Debugging a script in both Bash and Zsh
#!/bin/bash -x

echo "Debugging Bash script"

การใช้แฟล็ก -x ในสคริปต์ Bash นี้ทำหน้าที่อำนวยความสะดวกในการดำเนินการแก้ไขจุดบกพร่อง ฟังก์ชันนี้อาจถูกจำลองแบบภายในบริบท Zsh โดยการแทนที่ bash ด้วย zsh ดังนั้นจึงรวมประโยชน์ของมันเข้ากับสภาพแวดล้อมเชลล์หลัง

ข้อควรพิจารณาในการเลือกระหว่าง Zsh และ Bash

ความแพร่หลายของ Bash ในฐานะเชลล์เริ่มต้นบนแพลตฟอร์มที่ใช้ Unix จำนวนมากนั้นทำให้มีระดับความเข้ากันได้และความสามารถในการขนส่งที่สูงขึ้น ทำให้เป็นตัวเลือกที่ปลอดภัยยิ่งขึ้นสำหรับความพยายามในการเขียนสคริปต์หลายระบบที่จำเป็นต้องมีการปรับเปลี่ยนน้อยที่สุดในสถาปัตยกรรมฮาร์ดแวร์ที่หลากหลาย

Zsh นำเสนอความสามารถที่ซับซ้อนมากมาย เช่น อาเรย์แบบเชื่อมโยง รูปแบบโกลบอลที่ได้รับการปรับปรุง และตัวเลือกการขยายพารามิเตอร์ที่ซับซ้อน ซึ่งทำให้กระบวนการเขียนสคริปต์ระดับสูงง่ายขึ้น คุณลักษณะเหล่านี้มีประโยชน์อย่างยิ่งสำหรับผู้ที่ต้องการการประมวลผลสตริงที่เหนือกว่าและความซับซ้อนของโครงสร้างในสคริปต์

เชลล์ Bash และ Zsh ต่างก็มีชุมชนที่เจริญรุ่งเรือง แต่อย่างหลังมีชุมชนที่แข็งแกร่งกว่าและมีปลั๊กอินและธีมให้เลือกมากมาย สำหรับผู้ที่ให้ความสำคัญกับการปรับเปลี่ยนในแบบของคุณ สิ่งนี้อาจเป็นประโยชน์อย่างมากต่อ Zsh

Bash เป็นเชลล์ที่ใช้งานง่ายและใช้กันอย่างแพร่หลาย ทำหน้าที่เป็นช่องทางที่เข้าถึงได้สำหรับผู้ที่ไม่คุ้นเคยกับการเขียนสคริปต์เชลล์ เอกสารประกอบมากมายและสื่อการสอนสำหรับผู้เริ่มต้นช่วยลดความซับซ้อนของกระบวนการเข้าใจแนวคิดพื้นฐานในโดเมนนี้

การทำงานอัตโนมัติโดยใช้เชลล์สคริปต์

การใช้ภาษาสคริปต์อย่างเหมาะสมเพื่อปรับปรุงกระบวนการผ่านการใช้งานเชลล์สคริปต์ถือเป็นคุณค่าที่สำคัญ ด้วยกลไกงานที่เกิดซ้ำ จึงสามารถประหยัดเวลาได้มาก

นอกเหนือจากการจัดการบัญชีผู้ใช้ การตรวจสอบทรัพยากรระบบ การสำรองข้อมูล และการบำรุงรักษาตามปกติแล้ว สคริปต์เหล่านี้ยังสามารถใช้เพื่อลดโอกาสที่มนุษย์จะควบคุมดูแลได้