ในฐานะที่เป็นเชลล์เริ่มต้นสำหรับตัวแปร Linux และ Unix จำนวนมาก Bash มีคุณสมบัติที่หลากหลายที่ไม่ค่อยได้ใช้งาน ดังนั้นจึงเป็นการยากที่จะตัดสินใจว่าจะพูดถึงอะไร ท้ายที่สุด ฉันตัดสินใจเน้นที่ Bash tips ที่ทำให้กิจกรรมในแต่ละวันง่ายขึ้น
ในฐานะที่ปรึกษา ฉันเห็นสภาพแวดล้อมและรูปแบบการทำงานที่หลากหลาย ฉันใช้ประสบการณ์นี้เพื่อจำกัดเคล็ดลับให้แคบลงเป็นหมวดหมู่กว้างๆ สี่หมวดหมู่:เทคนิคเทอร์มินัลและไลน์ การนำทางและไฟล์ ประวัติ และคำสั่งที่เป็นประโยชน์ หมวดหมู่เหล่านี้ใช้โดยพลการโดยสิ้นเชิงและใช้เพื่อจัดระเบียบความคิดของฉันเองมากกว่าการจัดประเภทขั้นสุดท้าย เคล็ดลับมากมายในที่นี้อาจเหมาะกับมากกว่าหนึ่งหมวดหมู่
โดยไม่ต้องกังวลใจอีกต่อไป นี่คือเคล็ดลับ Bash ที่มีประโยชน์ที่สุดบางส่วนที่ฉันได้พบ
การทำงานกับประวัติ Bash
หนึ่งในวิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพของคุณคือการเรียนรู้การใช้ประวัติ Bash อย่างมีประสิทธิภาพมากขึ้น ด้วยเหตุนี้ การปรับแต่งที่สำคัญที่สุดอย่างหนึ่งที่คุณสามารถทำได้ในสภาพแวดล้อมที่มีผู้ใช้หลายคนคือการเปิดใช้งาน histappend
ตัวเลือกสำหรับเชลล์ของคุณ ในการทำเช่นนั้น เพียงเรียกใช้คำสั่งต่อไปนี้:
shopt -s histappend
ซึ่งช่วยให้เซสชันเทอร์มินัลหลายเซสชันสามารถเขียนไปยังประวัติได้พร้อมกัน ในสภาพแวดล้อมส่วนใหญ่ ตัวเลือกนี้จะ ไม่ เปิดใช้งาน ซึ่งหมายความว่าประวัติมักจะสูญหายไปหากคุณเปิดเซสชัน Bash มากกว่าหนึ่งเซสชัน (ในเครื่องหรือบน SSH)
งานทั่วไปอีกประการหนึ่งคือการทำซ้ำคำสั่งสุดท้ายด้วย sudo
. ตัวอย่างเช่น สมมติว่าคุณต้องการสร้างไดเรกทอรี mkdir /etc/ansible/facts.d
. เว้นแต่คุณจะรูท คำสั่งนี้จะล้มเหลว จากสิ่งที่ฉันสังเกต ผู้ใช้ส่วนใหญ่กด up
ลูกศร เลื่อนไปที่จุดเริ่มต้นของบรรทัด และเพิ่ม 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
เมื่อ !!
ถูกเรียกใช้ คำสั่งแบบเต็มจะก้องออกไปที่เทอร์มินัล เพื่อให้คุณรู้ว่าเพิ่งดำเนินการอะไร
คล้ายกันแต่ใช้บ่อยน้อยกว่ามากคือ !*
ทางลัด สิ่งนี้บอก Bash ว่าคุณต้องการ *อาร์กิวเมนต์* . ทั้งหมด จากคำสั่งก่อนหน้าที่จะทำซ้ำในคำสั่งปัจจุบัน สิ่งนี้อาจมีประโยชน์สำหรับคำสั่งที่มีอาร์กิวเมนต์มากมายที่คุณต้องการใช้ซ้ำ ตัวอย่างง่ายๆ คือการสร้างไฟล์จำนวนมากแล้วเปลี่ยนการอนุญาต:
[user@centos tmp]$ touch file1 file2 file3 file4
[user@centos tmp]$ chmod 777 !*
chmod 777 file1 file2 file3 file4
มีประโยชน์เฉพาะในสถานการณ์ที่เฉพาะเจาะจงเท่านั้น แต่อาจช่วยให้คุณประหยัดการกดแป้นพิมพ์ได้บ้าง
พูดถึงการบันทึกการกดแป้น เรามาพูดถึงการค้นหาคำสั่งในประวัติของคุณกัน ผู้ใช้ส่วนใหญ่จะทำสิ่งนี้:
history |grep <some command>
อย่างไรก็ตาม มีวิธีที่ง่ายกว่าในการค้นหาประวัติของคุณ หากคุณกด
ctrl + r
Bash จะทำการค้นหาประวัติย้อนหลังของคุณ เมื่อคุณเริ่มพิมพ์ ผลลัพธ์จะเริ่มปรากฏขึ้น ตัวอย่างเช่น:
(reverse-i-search)`hist': shopt -s histappend
ในตัวอย่างข้างต้น ฉันพิมพ์ hist
และตรงกับ shopt
คำสั่งที่เรากล่าวถึงก่อนหน้านี้ หากคุณกด ctrl + r
. ต่อไป , Bash จะทำการค้นหาย้อนหลังต่อไปในแมตช์อื่นๆ ทั้งหมด
เคล็ดลับสุดท้ายของเราไม่ใช่กลอุบายเท่าคำสั่งที่เป็นประโยชน์ที่คุณสามารถใช้เพื่อนับและแสดงคำสั่งที่ใช้บ่อยที่สุดในประวัติของคุณ
[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
เป็นคำสั่งที่ใช้มากที่สุดในประวัติศาสตร์ของฉันในขณะนี้
การนำทางและการตั้งชื่อไฟล์
คุณคงรู้อยู่แล้วว่าถ้าคุณพิมพ์คำสั่ง ชื่อไฟล์ หรือชื่อโฟลเดอร์ คุณสามารถกด tab
คีย์หนึ่งครั้งเพื่อทำให้ถ้อยคำของคุณสมบูรณ์ วิธีนี้ใช้ได้หากมีการจับคู่แบบตรงทั้งหมดเพียงรายการเดียว อย่างไรก็ตาม คุณอาจไม่รู้ว่าถ้าคุณกด tab
สองครั้งจะแสดงการแข่งขันทั้งหมดตามสิ่งที่คุณพิมพ์ ตัวอย่างเช่น:
[user@centos tmp]$ cd /lib <tab><tab>
lib/ lib64/
สิ่งนี้มีประโยชน์มากสำหรับการนำทางระบบไฟล์ เคล็ดลับที่เป็นประโยชน์อีกประการหนึ่งคือการเปิดใช้งาน cdspell
ในเปลือกของคุณ คุณสามารถทำได้โดยออก shopt -s cdspell
สั่งการ. ซึ่งจะช่วยแก้ไขการสะกดผิดของคุณ:
[user@centos etc]$ cd /tpm
/tmp
[user@centos tmp]$ cd /ect
/etc
มันไม่สมบูรณ์แบบ แต่ก็ช่วยได้นิดหน่อย!
เมื่อคุณเปลี่ยนไดเร็กทอรีสำเร็จแล้ว ถ้าคุณต้องการกลับไปยังไดเร็กทอรีก่อนหน้าของคุณล่ะ นี่ไม่ใช่เรื่องใหญ่ถ้าคุณไม่ลึกเข้าไปในแผนผังไดเร็กทอรี แต่ถ้าคุณอยู่ในเส้นทางที่ค่อนข้างลึก เช่น /var/lib/flatpak/exports/share/applications/
, คุณสามารถพิมพ์:
cd /va<tab>/lib/fla<tab>/ex<tab>/sh<tab>/app<tab>
โชคดีที่ 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
ทั้งหมดนั้นดีและดี แต่ถ้าคุณมีไดเร็กทอรีจำนวนมากที่คุณต้องการนำทางภายในอย่างง่ายดายล่ะ ทุบตีคุณครอบคลุมที่นั่นเช่นกัน มีตัวแปรที่คุณสามารถตั้งค่าได้ซึ่งจะช่วยให้คุณนำทางได้อย่างมีประสิทธิภาพมากขึ้น นี่คือตัวอย่าง:
[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
ในตัวอย่างข้างต้น ฉันตั้งค่าโฮมไดเร็กตอรี่ของฉัน (ระบุด้วยเครื่องหมายตัวหนอน:~
), /var/log
และ /etc
. สิ่งใดก็ตามที่ระดับบนสุดของไดเร็กทอรีเหล่านี้จะถูกป้อนโดยอัตโนมัติเมื่อคุณอ้างอิง ไดเร็กทอรีที่ไม่ได้อยู่ที่ฐานของไดเร็กทอรีที่ระบุไว้ใน CDPATH
จะไม่พบ ตัวอย่างเช่น หากไดเร็กทอรีที่คุณอยู่คือ /etc/ansible/facts.d/
นี้จะไม่สมบูรณ์โดยการพิมพ์ cd facts.d
. เนื่องจากในขณะที่ไดเร็กทอรี ansible
อยู่ภายใต้ /etc
, facts.d
ไม่ใช่. ดังนั้น CDPATH
มีประโยชน์ในการไปที่ด้านบนสุดของทรีที่คุณเข้าถึงบ่อยๆ แต่การจัดการอาจยุ่งยากเมื่อคุณเรียกดูโครงสร้างโฟลเดอร์ขนาดใหญ่
สุดท้ายนี้ เรามาพูดถึงกรณีการใช้งานทั่วไปสองแบบที่ทุกคนทำกันในบางครั้ง:การเปลี่ยนนามสกุลไฟล์และการเปลี่ยนชื่อไฟล์ เมื่อมองแวบแรก นี่อาจฟังดูเหมือนกัน แต่ Bash เสนอลูกเล่นที่แตกต่างกันเล็กน้อยเพื่อทำงานเหล่านี้ให้สำเร็จ
แม้ว่าการดำเนินการดังกล่าวอาจเป็นการดำเนินการที่ "สกปรกและสกปรก" แต่ผู้ใช้ส่วนใหญ่ในบางจุดจำเป็นต้องสร้างสำเนาของไฟล์ที่กำลังทำงานอยู่อย่างรวดเร็ว ส่วนใหญ่จะคัดลอกชื่อไฟล์ทั้งหมดและต่อท้ายนามสกุลไฟล์เช่น .old
หรือ .bak
. มีทางลัดด่วนสำหรับสิ่งนี้ใน Bash สมมติว่าคุณมีชื่อไฟล์เช่น spideroak_inotify_db.07pkh3
ที่คุณต้องการเก็บสำเนาไว้ คุณสามารถพิมพ์:
cp spideroak_inotify_db.07pkh3 spideroak_inotify_db.07pkh3.bak
คุณสามารถทำสิ่งนี้ได้อย่างรวดเร็วโดยใช้การดำเนินการคัดลอก/วาง ใช้แท็บให้สมบูรณ์ อาจใช้ปุ่มลัดตัวใดตัวหนึ่งเพื่อทำซ้ำอาร์กิวเมนต์ หรือเพียงพิมพ์สิ่งทั้งหมดออกมา อย่างไรก็ตาม คำสั่งด้านล่างควรพิสูจน์ได้เร็วยิ่งขึ้นเมื่อคุณคุ้นเคยกับการพิมพ์:
cp spideroak_inotify_db.07pkh3{,.old}
สิ่งนี้ (อย่างที่คุณเดาได้) คัดลอกไฟล์โดยต่อท้าย .old
ไฟล์นามสกุลเป็นไฟล์. ดีมาก คุณอาจจะพูดว่า แต่ฉันต้องการเปลี่ยนชื่อไฟล์จำนวนมากในคราวเดียว แน่นอน คุณ สามารถ เขียน for loop เพื่อจัดการกับสิ่งเหล่านี้ (และอันที่จริงฉันมักจะทำเช่นนี้สำหรับบางสิ่งที่ซับซ้อน) แต่ทำไมคุณถึงทำเมื่อมียูทิลิตี้ที่มีประโยชน์ที่เรียกว่า rename
? การใช้งานยูทิลิตี้นี้มีความแตกต่างกันระหว่าง Debian/Ubuntu และ CentOS/Arch การเปลี่ยนชื่อตามเดเบียนใช้รูปแบบคล้าย 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 มีแป้นพิมพ์ลัดในตัวมากมาย คุณสามารถค้นหารายการได้โดยพิมพ์ bind -p
. ฉันคิดว่ามันน่าจะมีประโยชน์ที่จะเน้นหลายๆ อย่าง แม้ว่าบางคนอาจจะรู้จักดี
- ctrl + _ (เลิกทำ)
- ctrl + t (สลับอักขระสองตัว)
- ALT + t (สลับสองคำ)
- ALT + (พิมพ์อาร์กิวเมนต์สุดท้ายจากคำสั่งก่อนหน้า)
- ctrl + x + * (ขยาย glob/star)
- ctrl + ลูกศร (เลื่อนไปข้างหน้าหนึ่งคำ)
- ALT + f (เลื่อนไปข้างหน้าหนึ่งคำ)
- ALT + b (ถอยหลังหนึ่งคำ)
- ctrl + x ตามด้วย ctrl + e (เปิดสตริงคำสั่งในตัวแก้ไขเพื่อให้คุณแก้ไขก่อนดำเนินการได้)
- ctrl + e (เลื่อนเคอร์เซอร์ไปที่จุดสิ้นสุด)
- ctrl + a (เลื่อนเคอร์เซอร์เพื่อเริ่ม)
- ctrl + xx (เลื่อนไปฝั่งตรงข้าม)
- ctrl + u (ตัดทุกอย่างก่อนเคอร์เซอร์)
- ctrl + k (ตัดทุกอย่างหลังเคอร์เซอร์)
- ctrl + y (วางจากบัฟเฟอร์)
- ctrl + l (L ตัวพิมพ์เล็ก ล้างหน้าจอ)
ฉันจะไม่พูดถึงสิ่งที่ชัดเจนกว่านี้ อย่างไรก็ตาม แป้นพิมพ์ลัดที่มีประโยชน์ที่สุดบางส่วนที่ฉันพบคือแป้นพิมพ์ลัดที่ให้คุณลบคำ (หรือส่วนของข้อความ) และเลิกทำได้ สมมติว่าคุณกำลังจะหยุดบริการจำนวนมากโดยใช้ systemd
แต่คุณต้องการเริ่มต้นเพียงไม่กี่รายการหลังจากการดำเนินการบางอย่างเสร็จสิ้น คุณอาจทำสิ่งนี้:
systemctl stop httpd mariadb nfs smbd
<hit the up button to get the previous command>
<use 'ctrl + w' to remove the unwanted arguments>
แต่ถ้าคุณลบหนึ่งรายการมากเกินไป ไม่มีปัญหา—เพียงใช้ ctrl + _
เพื่อเลิกทำการแก้ไขล่าสุด
คำสั่งตัดอื่นๆ ช่วยให้คุณสามารถลบทุกอย่างได้อย่างรวดเร็วจากเคอร์เซอร์ไปยังจุดสิ้นสุดหรือต้นบรรทัด (โดยใช้ Ctrl + k
และ Ctrl + u
ตามลำดับ) สิ่งนี้มีประโยชน์เพิ่มเติมในการวางข้อความที่ตัดแล้วลงในบัฟเฟอร์ของเทอร์มินัล เพื่อให้คุณสามารถวางในภายหลังได้ (โดยใช้ ctrl + y
). คำสั่งเหล่านี้แสดงให้เห็นได้ยาก ดังนั้นเราขอแนะนำให้คุณลองใช้คำสั่งเหล่านี้ด้วยตัวเอง
สุดท้ายแต่ไม่ท้ายสุด ฉันต้องการพูดถึงชุดคีย์ผสมที่ไม่ค่อยได้ใช้ ซึ่งมีประโยชน์อย่างยิ่งในสภาพแวดล้อมที่จำกัด เช่น คอนเทนเนอร์ หากคุณเคยมีคำสั่งที่ดูสับสนโดยเอาต์พุตก่อนหน้า มีวิธีแก้ไข:การกด ctrl + x + ctrl + e
จะเปิดคำสั่งในเอดิเตอร์ที่ตั้งค่าไว้ในตัวแปรสภาพแวดล้อม EDITOR วิธีนี้จะช่วยให้คุณแก้ไขคำสั่งที่ยาวหรือผิดเพี้ยนในโปรแกรมแก้ไขข้อความที่ (อาจ) สามารถตัดข้อความได้ การบันทึกงานและการออก เช่นเดียวกับที่คุณทำเมื่อทำงานกับไฟล์ปกติ จะดำเนินการคำสั่งเมื่อออกจากโปรแกรมแก้ไข
เคล็ดลับเบ็ดเตล็ด
คุณอาจพบว่าการแสดงสีใน Bash shell สามารถปรับปรุงประสบการณ์ของคุณได้ หากคุณกำลังใช้เซสชันที่ไม่ได้เปิดใช้งานการปรับสี ด้านล่างนี้คือชุดคำสั่งที่คุณสามารถใส่ลงใน .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 แล้ว คุณยังสามารถใช้ลูกเล่นที่เรียบร้อยเพื่อประหยัดเวลาได้อีกด้วย ตัวอย่างเช่น หากต้องการเรียกใช้สองคำสั่งแบบ back-to-back โดยไม่คำนึงถึงสถานะการออกของแต่ละรายการ ให้ใช้ ;
เพื่อแยกคำสั่งตามที่แสดงด้านล่าง:
[user@centos /tmp]$ du -hsc * ; df -h
นี่เพียงคำนวณจำนวนพื้นที่ที่แต่ละไฟล์ในไดเร็กทอรีปัจจุบันใช้ไป (และรวมมัน) จากนั้นจะสอบถามระบบสำหรับการใช้ดิสก์ต่ออุปกรณ์บล็อก คำสั่งเหล่านี้จะทำงานโดยไม่คำนึงถึงข้อผิดพลาดที่สร้างโดย du
คำสั่ง
จะทำอย่างไรถ้าคุณต้องการดำเนินการเมื่อเสร็จสิ้นคำสั่งแรก? คุณสามารถใช้ &&
ชวเลขเพื่อระบุว่าคุณต้องการรันคำสั่งที่สองก็ต่อเมื่อคำสั่งแรกส่งคืนสถานะการออกที่สำเร็จ ตัวอย่างเช่น สมมติว่าคุณต้องการรีบูตเครื่องเฉพาะเมื่อการอัปเดตสำเร็จ:
[root@arch ~]$ pacman -Syu --noconfirm && reboot
บางครั้งเมื่อรันคำสั่ง คุณอาจต้องการจับภาพผลลัพธ์ คนส่วนใหญ่รู้จัก tee
คำสั่งซึ่งจะคัดลอกเอาต์พุตมาตรฐานไปยังทั้งเทอร์มินัลและไฟล์ อย่างไรก็ตาม หากคุณต้องการจับเอาท์พุตที่ซับซ้อนกว่านี้ เช่น strace
คุณจะต้องเริ่มทำงานกับการเปลี่ยนเส้นทาง I/O รายละเอียดของการเปลี่ยนเส้นทาง I/O อยู่นอกเหนือขอบเขตของบทความสั้นๆ นี้ แต่สำหรับจุดประสงค์ของเรา เราเกี่ยวข้องกับ STDOUT
และ STDERR
. วิธีที่ดีที่สุดในการจับภาพสิ่งที่คุณเห็นคือการรวมทั้งสองไฟล์ไว้ในไฟล์เดียว ในการดำเนินการนี้ ให้ใช้ 2>&1
การเปลี่ยนเส้นทาง
[root@arch ~]$ strace -p 1140 > strace_output.txt 2>&1
สิ่งนี้จะใส่เอาต์พุตที่เกี่ยวข้องทั้งหมดลงในไฟล์ชื่อ strace_output.txt
ไว้ดูภายหลัง
บางครั้งระหว่างคำสั่งที่รันเป็นเวลานาน คุณอาจต้องหยุดการทำงานชั่วคราว คุณสามารถใช้ทางลัด 'หยุด' ctrl + z
เพื่อหยุด (แต่ไม่ฆ่า) งาน งานจะถูกเพิ่มในคิวงาน แต่คุณจะไม่เห็นงานนั้นอีกจนกว่าคุณจะกลับมาทำงานต่อ งานนี้อาจกลับมาทำงานต่อได้ในภายหลังโดยใช้คำสั่งพื้นหน้า fg
.
นอกจากนี้ คุณยังสามารถหยุดงานชั่วคราวด้วย ctrl + s
. งานและผลลัพธ์ยังคงอยู่ในเบื้องหน้าของเทอร์มินัล และการใช้เชลล์ ไม่ กลับไปยังผู้ใช้ สามารถทำงานต่อได้โดยกด ctrl + q
.
หากคุณกำลังทำงานในสภาพแวดล้อมแบบกราฟิกโดยเปิดเทอร์มินัลจำนวนมาก คุณอาจพบว่าการมีแป้นพิมพ์ลัดสำหรับการคัดลอกและวางเอาต์พุตนั้นสะดวก ในการดำเนินการดังกล่าว ให้ใช้ทางลัดต่อไปนี้:
# Copies highlighted text
ctrl + shift + c
# Pastes text in buffer
ctrl + shift + v
สมมติว่าในผลลัพธ์ของคำสั่งดำเนินการ คุณเห็นคำสั่งอื่นถูกดำเนินการ และคุณต้องการรับข้อมูลเพิ่มเติม มีสองสามวิธีในการทำเช่นนี้ หากคำสั่งนี้อยู่ในเส้นทางของคุณที่ใดที่หนึ่ง คุณสามารถเรียกใช้ which
คำสั่งเพื่อค้นหาว่าคำสั่งนั้นอยู่ที่ไหนบนดิสก์ของคุณ:
[root@arch ~]$ which ls
/usr/bin/ls
ด้วยข้อมูลนี้ คุณสามารถตรวจสอบไบนารีด้วย 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
คุณสามารถดูข้อมูลได้ทุกประเภท แต่ที่สำคัญที่สุดสำหรับผู้ใช้ส่วนใหญ่คือ ELF 64-bit LSB
เรื่องไร้สาระ โดยพื้นฐานแล้วหมายความว่ามันเป็นไบนารีที่คอมไพล์ล่วงหน้าซึ่งต่างจากสคริปต์หรือไฟล์ปฏิบัติการประเภทอื่น เครื่องมือที่เกี่ยวข้องที่คุณสามารถใช้ตรวจสอบคำสั่งได้คือ 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
สุดท้ายแต่ไม่ท้ายสุด หนึ่งในเทคนิคที่ฉันโปรดปราน โดยเฉพาะอย่างยิ่งเมื่อทำงานกับคอนเทนเนอร์หรือในสภาพแวดล้อมที่ฉันมีความรู้หรือควบคุมน้อยคือ echo
สั่งการ. คำสั่งนี้สามารถใช้เพื่อทำทุกอย่างตั้งแต่การตรวจสอบเพื่อให้แน่ใจว่า for
. ของคุณ ลูปจะรันลำดับที่คาดไว้เพื่อให้คุณตรวจสอบว่าพอร์ตระยะไกลเปิดอยู่หรือไม่ ไวยากรณ์ง่ายมากในการตรวจสอบพอร์ตที่เปิดอยู่: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
ข้อความ. หากส่งแพ็กเก็ตสำเร็จจะไม่มีเอาต์พุต
ฉันหวังว่าเคล็ดลับเหล่านี้จะทำให้ Bash มีประสิทธิภาพและน่าใช้มากขึ้น มีเคล็ดลับมากมายที่ซ่อนอยู่ใน Bash มากกว่าที่ฉันได้ระบุไว้ที่นี่ อะไรคือสิ่งที่คุณโปรดปราน?
ภาคผนวก 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/<server ip>/<port>
`` (use back ticks to shell out)
# Examine executable
which <command>
file <path/to/file>
command -V <some command binary> (tells you whether <some binary> is a built-in, binary or alias)