Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

เคล็ดลับการทุบตีทุกวันที่บรรทัดคำสั่ง

ในฐานะที่เป็นเชลล์เริ่มต้นสำหรับตัวแปร 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)