Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เคล็ดลับ Bash สำคัญสำหรับประสิทธิภาพบรรทัดคำสั่งประจำวัน

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

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

โดยไม่พูดเยอะ นี่คือเคล็ดลับ Bash ที่มีประโยชน์ที่สุดที่ผمเคยพบ

การทำงานกับ Bash history

หนึ่งในวิธีที่ดีที่สุดเพื่อเพิ่มประสิทธิภาพคือเรียนรู้การใช้ Bash history ให้มีประสิทธิภาพมากขึ้น ด้วยความคิดนั้นในใจ อาจจะเป็นหนึ่งในการปรับแต่งที่สำคัญที่สุดที่คุณสามารถทำในสภาพแวดล้อม multi-user คือ เปิดใช้งานตัวเลือก histappend ให้กับ shell ของคุณ เพื่อทำเช่นนั้น ให้รันคำสั่งต่อไปนี้:

shopt -s histappend 

สิ่งนี้อนุญาตให้หลายเซสชันเทอร์มินัลเขียน history พร้อมกัน ในสภาพแวดล้อมส่วนใหญ่ ตัวเลือกนี้ ไม่ได้ เปิดใช้งาน หมายความว่า history มักสูญหายหากคุณเปิด Bash session มากกว่าหนึ่ง (ไม่ว่าจะเป็นในเครื่องหรือผ่าน SSH)

งานทั่วไปอีกอย่างคือการรันคำสั่งล่าสุดอีกครั้งด้วย sudo ตัวอย่างเช่น สมมติว่าคุณต้องการสร้างไดเรกทอรี mkdir /etc/ansible/facts.d หากคุณไม่ใช่ root คำสั่งนี้จะล้มเหลว จากสิ่งที่ผมสังเกต ผู้ใช้ส่วนใหญ่จะกดปุ่ม up arrow เลื่อนไปต้นบรรทัด และเพิ่มคำสั่ง sudo มีวิธีง่ายกว่า เพียงรันคำสั่งแบบนี้:

sudo !!

Bash จะรัน sudo และจากนั้นคำสั่งก่อนหน้าทั้งหมด นี่คือลักษณะที่แน่นอนเมื่อรันตามลำดับ:

[user@centos ~]$ mkdir -p /etc/ansible/facts.d
 mkdir: cannot create directory '/etc/ansible': Permission denied

 [user@centos ~]$ sudo !!
 sudo mkdir -p /etc/ansible/facts.d

เมื่อ !! ถูกรัน คำสั่งเต็มจะถูก echo ออกมาที่เทอร์มินัล ดังนั้นคุณจึงรู้ว่าคำสั่งไหนเพิ่งถูกรัน

คล้ายกันแต่ใช้น้อยกว่าคือ shortcut !* นี่บอก Bash ว่าคุณต้องการ *อาร์กิวเมนต์* ทั้งหมดจากคำสั่งก่อนหน้าซ้ำในคำสั่งปัจจุบัน นี่อาจมีประโยชน์สำหรับคำสั่งที่มีอาร์กิวเมนต์มากที่คุณต้องการนำกลับมาใช้ ตัวอย่างง่ายคือสร้างไฟล์จำนวนมาก แล้วเปลี่ยน permission บนพวกมัน:

[user@centos tmp]$ touch file1 file2 file3 file4
 [user@centos tmp]$ chmod 777 !*
 chmod 777 file1 file2 file3 file4

มันมีประโยชน์เฉพาะในชุดสถานการณ์เฉพาะ แต่อาจประหยัด keystrokes บ้าง

พูดถึงการประหยัด keystrokes มาพูดถึงการค้นหาคำสั่งใน history ของคุณ ผู้ใช้ส่วนใหญ่จะทำอย่างนี้:

history |grep <some command>

อย่างไรก็ตาม มีวิธีง่ายกว่าในการค้นหา history ของคุณ หากคุณกด

ctrl + r

Bash จะทำ reverse search ของ history ของคุณ เมื่อคุณเริ่มพิมพ์ ผลลัพธ์จะเริ่มปรากฏ ตัวอย่าง:

(reverse-i-search)`hist': shopt -s histappend

ในตัวอย่างข้างต้น ผมพิมพ์ hist และมัน match คำสั่ง shopt ที่เราครอบคลุมก่อนหน้านี้ หากคุณกด ctrl + r ต่อ Bash จะค้นหาย้อนหลังต่อไปใน matches อื่นๆ ทั้งหมด

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

[user@centos tmp]$ history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
 81 ssh
 50 sudo
 46 ls
 45 ping
 39 cd
 29 nvidia-xrun
 20 nmap
 19 export

ในตัวอย่างนี้ คุณเห็นว่า ssh เป็นคำสั่งที่ใช้มากที่สุดใน history ของผมในขณะนี้

การนำทางและการตั้งชื่อไฟล์

คุณน่าจะรู้แล้วว่าหากคุณพิมพ์คำสั่ง ชื่อไฟล์ หรือชื่อโฟลเดอร์ คุณสามารถกดปุ่ม tab หนึ่งครั้งเพื่อให้มัน auto-complete ให้คุณสิ่งนี้ทำงานหากมี exact match เดียว อย่างไรก็ตาม คุณอาจไม่รู้ว่าหากคุณกด tab สองครั้ง มันจะแสดง matches ทั้งหมดตามสิ่งที่คุณพิมพ์ ตัวอย่าง:

[user@centos tmp]$ cd /lib 
 lib/ lib64/ 

สิ่งนี้มีประโยชน์มากสำหรับการนำทางระบบไฟล์ เคล็ดลับที่ช่วยอีกคือการเปิดใช้งาน cdspell ใน shell ของคุณ คุณสามารถทำได้โดยการออกคำสั่ง shopt -s cdspell สิ่งนี้จะช่วยแก้ไข typo ของคุณ:

[user@centos etc]$ cd /tpm
 /tmp
 [user@centos tmp]$ cd /ect
 /etc

มันไม่สมบูรณ์ แต่ทุกอย่างเล็กๆ น้อยๆ ช่วยได้!

เมื่อคุณเปลี่ยนไดเรกทอรีสำเร็จแล้ว ถ้าคุณต้องการกลับไปไดเรกทอรีก่อนหน้า? นี่ไม่ใช่เรื่องใหญ่หากคุณไม่ได้ลึกในไดเรกทอรี tree แต่หากคุณอยู่ใน path ที่ลึก למדי เช่น /var/lib/flatpak/exports/share/applications/ คุณอาจพิมพ์:

cd /va/lib/fla/ex/sh/app

โชคดีที่ Bash จำไดเรกทอรีก่อนหน้าของคุณ และคุณสามารถกลับไปได้โดยพิมพ์ cd - นี่คือลักษณะที่จะเป็น:

[user@centos applications]$ pwd
 /var/lib/flatpak/exports/share/applications

 [user@centos applications]$ cd /tmp
 [user@centos tmp]$ pwd
 /tmp

 [user@centos tmp]$ cd -
 /var/lib/flatpak/exports/share/applications

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

[user@centos applications]$ export CDPATH='~:/var/log:/etc'
 [user@centos applications]$ cd hp
 /etc/hp

 [user@centos hp]$ cd Downloads
 /home/user/Downloads

 [user@centos Downloads]$ cd ansible
 /etc/ansible

 [user@centos Downloads]$ cd journal
 /var/log/journal

ในตัวอย่างข้างต้น ผมตั้งค่า home directoryของผม (บ่งชี้ด้วย tilde: ~), /var/log และ /etc อะไรก็ตามที่ระดับบนสุดของไดเรกทอรีเหล่านี้จะถูก auto-filled เมื่อคุณอ้างถึงพวกมัน ไดเรกทอรีที่ไม่อยู่ที่ base ของไดเรกทอรีที่ระบุใน CDPATH จะไม่ถูกพบ ตัวอย่างเช่น หากไดเรกทอรีที่คุณตามหาอยู่ที่ /etc/ansible/facts.d/ นี่จะไม่ complete โดยการพิมพ์ cd facts.d เพราะในขณะที่ไดเรกทอรี ansible พบภายใต้ /etc facts.d ไม่ได้ ดังนั้น CDPATH มีประโยชน์สำหรับไปยังจุดสูงสุดของ tree ที่คุณเข้าถึงบ่อย แต่อาจกลายเป็นยุ่งยากเมื่อคุณกำลัง browse โครงสร้างโฟลเดอร์ใหญ่

สุดท้าย มาพูดถึงสองกรณีการใช้งานทั่วไปที่ทุกคนทำในบางครั้ง: การเปลี่ยน副檔名ไฟล์ และการ rename ไฟล์ ต้องยอมรับว่าใน מבטแรก นี่อาจ聽起來เหมือนกัน แต่ Bash เสนอเคล็ดลับบางอย่างเพื่อทำภารกิจเหล่านี้

แม้จะเป็นการดำเนินการ "down-and-dirty" ผู้ใช้ส่วนใหญ่ในบางครั้งต้องสร้างสำเนาไฟล์ที่กำลังทำงานอยู่อย่างรวดเร็ว ส่วนใหญ่จะ copy ชื่อไฟล์ทุกตัว และแค่ต่อท้าย副檔名อย่าง .old หรือ .bak มี shortcut รวดเร็วสำหรับสิ่งนี้ใน Bash สมมติว่าคุณมีชื่อไฟล์แบบ spideroak_inotify_db.07pkh3 ที่คุณต้องการเก็บสำเนาไว้ คุณอาจพิมพ์:

cp spideroak_inotify_db.07pkh3 spideroak_inotify_db.07pkh3.bak

คุณสามารถทำได้รวดเร็วด้วยการ copy/paste การ tab complete หรือใช้ shortcut หนึ่งในการซ้ำอาร์กิวเมนต์ หรือพิมพ์ทั้งหมดออกมา อย่างไรก็ตาม คำสั่งด้านล่างควรจะเร็วกว่าอีกเมื่อคุณคุ้นเคยกับการพิมพ์มัน:

cp spideroak_inotify_db.07pkh3{,.old}

สิ่งนี้ (ตามที่คุณคาดเดา) copy ไฟล์โดยต่อท้าย副檔名 .old ไปที่ไฟล์ นั่นดี คุณอาจพูดว่า แต่ผมอยาก rename ไฟล์จำนวนมากพร้อมกัน แน่นอน คุณ สามารถ เขียน for loop เพื่อจัดการกับเหล่านี้ (และจริงๆ ผมมักทำเช่นนี้สำหรับสิ่งที่ซับซ้อน) แต่ทำไมต้องทำเมื่อมี utility ที่น่าสะดวกชื่อ rename? มีความแตกต่างบ้างในการใช้งาน utility นี้ระหว่าง Debian/Ubuntu และ CentOS/Arch เวอร์ชัน Debian-based rename ใช้ syntax แบบ SED:

user@ubuntu-1604:/tmp$ for x in `seq 1 5`; do touch old_text_file_${x}.txt; done

 user@ubuntu-1604:/tmp$ ls old_text_file_*
 old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
 old_text_file_2.txt old_text_file_4.txt

 user@ubuntu-1604:/tmp$ rename 's/old_text_file/shiney_new_doc/' *.txt

 user@ubuntu-1604:/tmp$ ls shiney_new_doc_*
 shiney_new_doc_1.txt shiney_new_doc_3.txt shiney_new_doc_5.txt
 shiney_new_doc_2.txt shiney_new_doc_4.txt

บนกล่อง CentOS หรือ Arch จะดูคล้ายกัน:

[user@centos /tmp]$ for x in `seq 1 5`; do touch old_text_file_${x}.txt; done

 [user@centos /tmp]$ ls old_text_file_*
 old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
 old_text_file_2.txt old_text_file_4.txt

 [user@centos tmp]$ rename old_text_file centos_new_doc *.txt

 [user@centos tmp]$ ls centos_new_doc_*
 centos_new_doc_1.txt centos_new_doc_3.txt centos_new_doc_5.txt
 centos_new_doc_2.txt centos_new_doc_4.txt

Bash key bindings (การผูกปุ่ม)

Bash มี keyboard shortcuts ที่ built-in มากมาย คุณสามารถหารายการได้โดยพิมพ์ bind -p ผมคิดว่าจะมีประโยชน์ที่จะเน้นบางอย่าง แม้บางอย่างอาจรู้จักกันดี

  • ctrl + _ (undo)
  • ctrl + t (สลับสองตัวอักษร)
  • ALT + t (สลับสองคำ)
  • ALT + . (พิมพ์อาร์กิวเมนต์สุดท้ายจากคำสั่งก่อนหน้า)
  • ctrl + x + * (ขยาย glob/star)
  • ctrl + arrow (เลื่อนไปข้างหน้าหนึ่งคำ)
  • ALT + f (เลื่อนไปข้างหน้าหนึ่งคำ)
  • ALT + b (เลื่อนถอยหลังหนึ่งคำ)
  • ctrl + x ตามด้วย ctrl + e (เปิดสตริงคำสั่งใน editor เพื่อแก้ไขก่อน execute)
  • ctrl + e (เลื่อนเคอร์เซอร์ไปท้าย)
  • ctrl + a (เลื่อนเคอร์เซอร์ไปหน้า)
  • ctrl + xx (เลื่อนไปปลายตรงข้ามของบรรทัด)
  • ctrl + u (ตัดทุกอย่างก่อนเคอร์เซอร์)
  • ctrl + k (ตัดทุกอย่างหลังเคอร์เซอร์)
  • ctrl + y (วางจาก buffer)
  • ctrl + l (ตัว L เล็ก ล้างหน้าจอ)

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

systemctl stop httpd mariadb nfs smbd
 
 

แต่ถ้าคุณลบมากเกินไป? ไม่มีปัญหา – ใช้ ctrl + _ เพื่อ undo การแก้ไขล่าสุด

คำสั่งตัดอื่นๆ อนุญาตให้คุณลบทุกอย่างจากเคอร์เซอร์ไปจนจบหรือต้นบรรทัดได้อย่างรวดเร็ว (ใช้ Ctrl + k และ Ctrl + u ตามลำดับ) สิ่งนี้มีประโยชน์เพิ่มเติมคือวางข้อความที่ตัดไว้ใน buffer ของเทอร์มินัล เพื่อให้คุณ paste ได้ภายหลัง (ใช้ ctrl + y) คำสั่งเหล่านี้ยากต่อการสาธิตที่นี่ ดังนั้นผมขอแนะนำให้คุณลองใช้เอง

สุดท้ายแต่อย่างไรก็ตาม ผมอยากกล่าวถึงการรวมปุ่มที่นادرใช้ซึ่งอาจมีประโยชน์มากในสภาพแวดล้อมแคบๆ เช่น containers หากคุณเคยมีคำสั่งดูแปลกปนจาก output ก่อนหน้า มีวิธีแก้: กด ctrl + x + ctrl + e จะเปิดคำสั่งใน editor ใดๆ ที่ตั้งค่าไว้ในตัวแปรสภาพแวดล้อม EDITOR นี่จะให้คุณแก้ไขคำสั่งยาวหรือแปลกปนใน text editor ที่ (อาจ) wrap ข้อความได้ การบันทึกงานและออก แค่เหมือนตอนทำงานกับไฟล์ปกติ จะ execute คำสั่งเมื่อออกจาก editor

เคล็ดลับทั่วไป

คุณอาจพบว่าการมีสีแสดงใน Bash shell ของคุณสามารถเพิ่มประสบการณ์ได้ หากคุณใช้เซสชันที่ไม่มี colorization เปิดใช้งาน ด้านล่างคือชุดคำสั่งที่คุณสามารถวางใน .bash_profile ของคุณเพื่อเพิ่มสีในเซสชันของคุณ นี่ค่อนข้างตรงไปตรงมา และไม่ควรต้องการคำอธิบายลึก:

# enable colors
 eval "`dircolors -b`"

 # force ls to always use color and type indicators
 alias ls='ls -hF --color=auto'

 # make the dir command work kinda like in windows (long format)
 alias dir='ls --color=auto --format=long'

 # make grep highlight results using color
 export GREP_OPTIONS='--color=auto'

 # Add some colour to LESS/MAN pages
 export LESS_TERMCAP_mb=$'\E[01;31m'
 export LESS_TERMCAP_md=$'\E[01;33m'
 export LESS_TERMCAP_me=$'\E[0m'
 export LESS_TERMCAP_se=$'\E[0m'
 export LESS_TERMCAP_so=$'\E[01;42;30m'
 export LESS_TERMCAP_ue=$'\E[0m'
 export LESS_TERMCAP_us=$'\E[01;36m'

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

[user@centos /tmp]$ du -hsc * ; df -h

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

ถ้าคุณต้องการให้มีการดำเนินการเมื่อคำสั่งแรกสำเร็จ? คุณสามารถใช้ shorthand && เพื่อบ่งชี้ว่าคุณต้องการรันคำสั่งที่สองก็ต่อเมื่อคำสั่งแรกส่งคืนสถานะการออกที่สำเร็จ ตัวอย่างเช่น สมมติว่าคุณต้องการ reboot เครื่องก็ต่อเมื่ออัปเดตสำเร็จ:

[root@arch ~]$ pacman -Syu --noconfirm && reboot

บางครั้งเมื่อรันคำสั่ง คุณอาจต้องการ capture output ของมัน คนส่วนใหญ่รู้จักคำสั่ง tee ซึ่งจะ copy standard output ไปทั้งเทอร์มินัลและไฟล์ อย่างไรก็ตาม หากคุณต้องการ capture output ที่ซับซ้อนมากกว่า จาก strace คุณจะต้องเริ่มทำงานกับ I/O redirection รายละเอียดของ I/O redirection อยู่นอกขอบเขตของบทความสั้นนี้ แต่เพื่อวัตถุประสงค์ของเรา เราสนใจ STDOUT และ STDERR วิธีที่ดีที่สุดในการ capture ทุกอย่างที่คุณเห็นคือรวมทั้งสองในไฟล์เดียว เพื่อทำเช่นนั้น ใช้ redirect 2>&1

[root@arch ~]$ strace -p 1140 > strace_output.txt 2>&1

สิ่งนี้จะวาง output ที่เกี่ยวข้องทั้งหมดลงในไฟล์ชื่อ strace_output.txt สำหรับดูภายหลัง

บางครั้งระหว่างคำสั่งที่รันนาน คุณอาจต้องการ pause การทำงานของงาน คุณสามารถใช้ shortcut 'stop' ctrl + z เพื่อหยุด (แต่ไม่ kill) งาน งานจะถูกเพิ่มเข้า job queue แต่คุณจะไม่เห็นงานจนกว่าจะ resume มัน งานนี้อาจ resume ในเวลาต่อไปโดยใช้คำสั่ง foreground fg

เพิ่มเติม คุณอาจ pause งานด้วย ctrl + s งานและ output ของมันอยู่ในเทอร์มินัล foreground และการใช้ shell ไม่ ถูกคืนให้ผู้ใช้ งานอาจ resume ได้โดยกด ctrl + q

หากคุณทำงานในสภาพแวดล้อมกราฟิกกับเทอร์มินัลหลายตัวเปิดอยู่ คุณอาจพบว่ามีปุ่มลัดคีย์บอร์ดสำหรับ copy และ paste output นั้นสะดวก เพื่อทำเช่นนั้น ใช้ shortcuts ต่อไปนี้:

# Copies highlighted text
 ctrl + shift + c

 # Pastes text in buffer
 ctrl + shift + v

สมมติว่าใน output ของคำสั่งที่กำลัง execute คุณเห็นคำสั่งอื่นกำลัง execute และคุณอยากได้ข้อมูลเพิ่มเติม มีหลายวิธีทำ หากคำสั่งนั้นอยู่ใน path ของคุณที่ไหนสักแห่ง คุณสามารถรันคำสั่ง which เพื่อค้นหาว่าคำสั่งนั้นอยู่ที่ไหนบนดิสก์ของคุณ:

[root@arch ~]$ which ls
 /usr/bin/ls

ด้วยข้อมูลนี้ คุณสามารถตรวจสอบ binary ด้วยคำสั่ง file:

[root@arch ~]$ file /usr/bin/ls
 /usr/bin/ls: ELF 64-bit LSB pie executable x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d4e02b88e596e4f82c6cc62a5bc4ce5827209a49, stripped

คุณเห็นข้อมูลทุกอย่าง แต่สิ่งสำคัญที่สุดสำหรับผู้ใช้ส่วนใหญ่คือ nonsense ELF 64-bit LSB นี้หมายถึงมันคือ precompiled binary ตรงข้ามกับ script หรือ executable อื่นๆ เครื่องมือที่เกี่ยวข้องที่คุณสามารถใช้ตรวจสอบคำสั่งคือ tool command เอง เพียงรัน command -V <command> จะให้ข้อมูลประเภทต่างๆ:

[root@arch ~]$ command -V ls
 ls is aliased to `ls --color=auto`

 [root@arch ~]$ command -V bash
 bash is /usr/bin/bash

 [root@arch ~]$ command -V shopt
 shopt is a shell builtin

สุดท้ายแต่อย่างไรก็ตาม หนึ่งในเคล็ดลับโปรดของผม โดยเฉพาะเมื่อทำงานกับ containers หรือในสภาพแวดล้อมที่ผมมีความรู้หรือการควบคุมน้อย คือคำสั่ง echo คำสั่งนี้สามารถใช้ทำทุกอย่าง ตั้งแต่ตรวจสอบให้แน่ใจว่า for loop ของคุณจะรัน sequence ที่คาดหวัง ไปจนถึงอนุญาตให้คุณตรวจสอบว่า remote ports เปิดอยู่หรือไม่ syntax ง่ายมากสำหรับตรวจสอบ port เปิด: echo > /dev/<udp or tcp>/<server ip>/<port> ตัวอย่าง:

user@ubuntu-1604:~$ echo > /dev/tcp/192.168.99.99/222
 -bash: connect: Connection refused
 -bash: /dev/tcp/192.168.99.99/222: Connection refused

 user@ubuntu-1604:~$ echo > /dev/tcp/192.168.99.99/22

หากพอร์ตปิดต่อประเภทการเชื่อมต่อที่คุณลอง คุณจะได้ข้อความ Connection refused หากแพ็กเก็ตส่งสำเร็จ จะไม่มี output

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

Appendix 1. รายการเคล็ดลับและทริคที่ครอบคลุม

# History related
 ctrl + r (reverse search)
 !! (rerun last command)
 !* (reuse arguments from previous command)
 !$ (use last argument of last command)
 shopt -s histappend (allow multiple terminals to write to the history file)
 history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head (list the most used history commands)

 # File and navigation
 cp /home/foo/realllylongname.cpp{,-old}
 cd -
 rename 's/text_to_find/been_renamed/' *.txt
 export CDPATH='/var/log:~' (variable is used with the cd built-in.)

 # Colourize bash

 # enable colors
 eval "`dircolors -b`"
 # force ls to always use color and type indicators
 alias ls='ls -hF --color=auto'
 # make the dir command work kinda like in windows (long format)
 alias dir='ls --color=auto --format=long'
 # make grep highlight results using color
 export GREP_OPTIONS='--color=auto'

 export LESS_TERMCAP_mb=$'\E[01;31m'
 export LESS_TERMCAP_md=$'\E[01;33m'
 export LESS_TERMCAP_me=$'\E[0m'
 export LESS_TERMCAP_se=$'\E[0m' # end the info box
 export LESS_TERMCAP_so=$'\E[01;42;30m' # begin the info box
 export LESS_TERMCAP_ue=$'\E[0m'
 export LESS_TERMCAP_us=$'\E[01;36m'

 # Bash shortcuts
 shopt -s cdspell (corrects typoos)
 ctrl + _ (undo)
 ctrl + arrow (move forward a word)
 ctrl + a (move cursor to start)
 ctrl + e (move cursor to end)
 ctrl + k (cuts everything after the cursor)
 ctrl + l (clears screen)
 ctrl + q (resume command that is in the foreground)
 ctrl + s (pause a long running command in the foreground)
 ctrl + t (swap two characters)
 ctrl + u (cuts everything before the cursor)
 ctrl + x + ctrl + e (opens the command string in an editor so that you can edit it before it runs)
 ctrl + x + * (expand glob/star)
 ctrl + xx (move to the opposite end of the line)
 ctrl + y (pastes from the buffer)
 ctrl + shift + c/v (copy/paste into terminal)

 # Running commands in sequence
 && (run second command if the first is successful)
 ; (run second command regardless of success of first one)

 # Redirecting I/O
 2>&1 (redirect stdout and stderr to a file)

 # check for open ports
 echo > /dev/tcp//
 `` (use back ticks to shell out)

 # Examine executable
 which 
 file 
 command -V  (tells you whether  is a built-in, binary or alias)