ในฐานะ 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 /liblib/ 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)