แนวปฏิบัติและคำแนะนำที่ดีที่สุดของบรรทัดคำสั่ง Linux?


112

ฉันต้องการเปิดการสนทนาที่จะรวบรวมแนวปฏิบัติและคำแนะนำที่ดีที่สุดของ Linux command line (CLI)

ฉันได้ค้นหาการสนทนาเพื่อแบ่งปันความคิดเห็นด้านล่าง แต่ไม่พบดังนั้นโพสต์นี้

ฉันหวังว่าเราทุกคนจะเรียนรู้จากสิ่งนี้

คุณสามารถแบ่งปันเคล็ดลับ Bash, grep, sed, AWK, / proc และการดูแลระบบอื่น ๆ ที่เกี่ยวข้องกับ Linux / Unix, การเขียนโปรแกรมเชลล์เพื่อให้ได้ประโยชน์สูงสุดจากพวกเราทุกคน


ทำไมต้องเป็น Linux เท่านั้น เคล็ดลับมากมายอาจมีประโยชน์กับ Unix เกือบทุกรสชาติ
mouviciel

คำถามนี้อาจจะมีตาดกว้าง - มีพอที่จะปฏิบัติที่ดีที่สุด Linux / Unix บรรทัดคำสั่งในการกรอกข้อมูลหนังสือทั้งหมด ...
Jonik

ฉันยอมรับว่าเคล็ดลับ unix ที่สามารถนำไปใช้กับ linux ได้เป็นอย่างดีฉันได้เขียน linux เพราะ A. นี่คือสิ่งที่เราทำงานด้วยที่นี่ B. เพราะมันได้รับการเปิดเผยต่อสาธารณะในวงกว้างมากขึ้นจากนั้นก็ใช้ยูนิกซ์ในช่วงไม่กี่ปีที่ผ่านมา
Maxim Veksler

ฉันคิดว่ามันเป็นความคิดที่ดีที่จะรวบรวมรายการคำสั่งที่มีประโยชน์และน่าสนใจที่สุดที่ผู้คนใช้

สิ่งเหล่านี้เกี่ยวข้องหรือไม่? refspecs.freestandards.org

คำตอบ:


111

ใช้หน้าจอซึ่งเป็นมัลติเทอร์มินัลอิสระที่พัฒนาโดยโครงการ GNU ที่จะช่วยให้คุณมีเทอร์มินัลหลายเครื่องในเครื่องเดียว

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


2
สวิตช์ที่ฉันใช้บ่อยที่สุดคือ 'หน้าจอ -D -R' สำหรับการถอดและกลับมาใช้งานเซสชันหน้าจอล่าสุดอีกครั้งและ 'หน้าจอ -x' เพื่อดูเซสชันหน้าจอเดียวกันจากการลงชื่อเข้าใช้หลายครั้ง รับตัวเองเป็นอย่างดี. screenrc จากdotfiles.org/.screenrc
Nick Devereaux

4
อีกสิ่งที่ดีเกี่ยวกับหน้าจอคือคุณสามารถแชร์เทอร์มินัลกับคนอื่นเมื่อคุณต้องการที่จะทำงานร่วมกันในบางสิ่งโดยใช้หน้าจอ -x
gareth_bowles

101

จุ๊!
SSH เป็นคำสั่ง god - ฉันคิดว่ามันเป็นคำสั่งที่มีค่าที่สุดสำหรับการเรียนรู้ ตัวเลือกอาจค่อนข้างน่ากลัว แต่ดูเหมือนว่าฉันเรียนรู้ที่จะใช้ตัวเลือกบรรทัดคำสั่งใหม่สำหรับ SSH อย่างต่อเนื่องซึ่งฉันไม่เคยคิดว่าจะจำเป็น ฉันอาจใช้มันทั้งหมดในตอนนี้

ยิ่งคุณใช้มันมากเท่าไหร่คุณก็ยิ่งเรียนรู้มากขึ้นเท่านั้น คุณสามารถใช้มันเพื่อทำสิ่งที่น่าอัศจรรย์

หมายเหตุ: สิ่งเหล่านี้สามารถทำได้จากระยะไกลโดยไม่มีการตั้งค่าบนเซิร์ฟเวอร์ของคุณยกเว้นเซิร์ฟเวอร์ที่ใช้งาน ssh

เมานต์ระบบไฟล์ผ่านอินเทอร์เน็ต

ค้นหา net สำหรับ SSHFS

คำสั่งไปข้างหน้า

โปรโตคอล SVN + SSH คือการโค่นล้มจากไคลเอนต์ระยะไกลไปยังเซิร์ฟเวอร์โดยที่ไม่มี DEAMON ทำงาน คำสั่ง SVN สตาร์ทเซิร์ฟเวอร์ผ่านเชลล์ ssh และส่งข้อมูลกลับไปกลับมาผ่านไพพ์ที่มีอยู่ โปรแกรม rsync ทำสิ่งเดียวกันทำงานกับเซิร์ฟเวอร์ที่ไม่มี rsync deamon โดยเริ่มต้นด้วย SSH ง่ายในการเขียนไฟล์ bash ของคุณเองเพื่อทำกลอุบายที่คล้ายกัน

เชื่อมโยงเพื่อรับผ่านไฟร์วอลล์

ฉันใช้สิ่งนี้ตลอดเวลาเพื่อข้ามผ่านเซิร์ฟเวอร์ linux ที่บ้านไปยัง mac ของฉัน

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

ส่งต่อคำขอ X:

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

เนื่องจากคุณไม่จำเป็นต้องมีเซิร์ฟเวอร์ X ที่ทำงานบนเซิร์ฟเวอร์ระยะไกลของคุณผลกระทบของ CPU บนเซิร์ฟเวอร์ของคุณจึงมีเพียงเล็กน้อยคุณจึงสามารถมีเซิร์ฟเวอร์ TINY Linux ที่ให้บริการแอพขนาดใหญ่สำหรับพีซีเกมที่ทรงพลังที่ใช้ Windows และ cygwin / X

แน่นอนว่า VI และ EMACS ทำงานกับ SSH แต่เมื่อฉันทำงานที่บ้านบางครั้งฉันต้องการมากกว่านี้ ฉันใช้ ssh -X เพื่อเริ่มต้นสำเนา Eclipse! หากเซิร์ฟเวอร์ของคุณมีประสิทธิภาพมากกว่าแล็ปท็อปของคุณคุณมี GUI อยู่ที่นั่นบนแล็ปท็อปของคุณ แต่การคอมไพล์เสร็จแล้วบนเซิร์ฟเวอร์ของคุณดังนั้นอย่ากังวลเกี่ยวกับการโหลดระบบ

ทำงานในแบทช์ไฟล์

(หมายถึงเรียกใช้ไฟล์แบทช์ในท้องถิ่นที่ "ทำสิ่ง" ในระบบอื่น):

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

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

สร้างขึ้นใน Mac

ทั้งเซิร์ฟเวอร์และไคลเอนต์สร้างไว้ในทั้ง mac และ linux ในกรณีของ Mac และ Ubuntu การเปิดใช้งานเซิร์ฟเวอร์นั้นง่ายพอ ๆ กับการค้นหาช่องทำเครื่องหมายที่ถูกต้อง

บนพีซีที่ติดตั้ง cygwin หรือ cygwin / X (cygwin / X จะช่วยให้คุณสามารถส่งต่อผลลัพธ์ x-window ของคุณจากเครื่อง Linux ของคุณไปยังพีซี Windows ของคุณ - มันติดตั้งเซิร์ฟเวอร์ X)

เคล็ดลับสำคัญ / ไฟล์กำหนดค่า

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

มีตัวเลือกการกำหนดค่ามากมายที่ช่วยให้คุณลดความซับซ้อนของคำสั่ง ssh ได้อย่างมาก นี่คือตัวอย่างของฉันที่ทำงาน:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

เมื่อฉันพิมพ์ "ssh home" (ไม่มีอะไรอื่น) มันทำหน้าที่เหมือนกับว่าฉันได้พิมพ์:

ssh -p 12345 bill@billshome.hopto.org

จากนั้นส่งต่อพอร์ตภายในเครื่องของฉันไปที่ระบบ 1025 "mac" ที่บ้าน เหตุผลนี้คือฉันมีรายการอื่นในไฟล์ของฉัน:

Host mac
    hostname localhost
    port=1025

ดังนั้นเมื่อฉันทำ "ssh home" และยังคงเปิดหน้าต่างฉันสามารถพิมพ์ "ssh mac" และคอมพิวเตอร์ที่ทำงานที่นี่จะพยายามเชื่อมต่อกับพอร์ต 1025 ของตัวเองซึ่งถูกส่งต่อไปยัง "mac: 22 "โดยคำสั่งอื่นดังนั้นมันจะเชื่อมต่อกับ Mac ของฉันที่บ้านผ่านไฟร์วอลล์

แก้ไข - สคริปต์สุดยอด!

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

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

หากคุณมีสคริปต์นี้ในโฮมไดเร็กตอรี่ของคุณและมีโฮสต์ที่คุณสามารถเชื่อมต่อกับ (ผ่าน ssh), จากนั้นคุณสามารถพิมพ์ "./authMe hostName"

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

หลังจากนี้คำสั่ง SSH ไม่ควรถามรหัสผ่านของคุณอีกต่อไปเมื่อทำการเชื่อมต่อกับระบบรีโมตนั้นจะใช้ public / private keypair

หากคอมพิวเตอร์ระยะไกลของคุณไม่ปลอดภัยเสมอคุณควรพิจารณาตั้งค่า "รหัสผ่าน" เมื่อได้รับแจ้ง

คุณอาจต้องการกำหนดค่าเซิร์ฟเวอร์ ssh ที่ปลายสุดเพื่อไม่อนุญาตรหัสผ่านแบบข้อความ (เฉพาะคีย์) เพื่อความปลอดภัยเพิ่มเติม


4
+1 โพสต์ที่ดีและกะทัดรัด
Karsten

2
หมายเหตุเล็ก ๆ เกี่ยวกับ SSH บนพอร์ต 22: หากคุณมีรหัสผ่านรูทที่ดีและผู้ใช้ของคุณไม่มีรหัสผ่านที่น่ากลัวเพียงแค่รัน fail2ban (หรือสิ่งที่คล้ายกัน) ก็เพียงพอที่จะป้องกันความพยายามในการถอดรหัส ฉันพบว่ามันน่ารำคาญจริงๆที่จะเก็บ SSH ไว้ที่พอร์ตอื่น
David Wolever

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

มีคำสั่งสุดท้ายในตัวของคุณในเวอร์ชันเกือบทุกรุ่นในปัจจุบันเรียกว่าssh-copy-idและมันง่ายเหมือนssh-copy-id user@someserver
JamesHannah

อีกวิธีในการทำเคล็ดลับ 'ssh mac' ของคุณคือการใช้คำสั่ง ProxyCommand ในไฟล์. ssh / config โฮสต์ mac ProxyCommand ssh -q home "nc% h% p" สิ่งนี้จะทำงาน netcat (nc) ที่บ้านและเปลี่ยนทิศทางการเชื่อมต่อ ssh ของคุณผ่านไปยัง mac ฉันค้นหาเชนที่ง่ายกว่า (ตัวอย่างเช่นหากคุณต้องการเชื่อมต่อกับ 'home' เพื่อไปที่ 'ป้อมปราการทำงาน' เพื่อไปที่ 'เซิร์ฟเวอร์เว็บทำงาน'
toppledwagon

73

ฉันชอบที่จะใช้

cd -

เพื่อสลับไปยังไดเรกทอรีก่อนหน้า มีประโยชน์มาก!


6
ฉันไม่เคยรู้เรื่องนี้! ขอบคุณ! ในบันทึกที่เกี่ยวข้อง pushd และ popd ทำสิ่งที่คล้ายกันโดยการสร้างกอง dirs เทคนิคเหล่านี้ช่วยเมื่อคุณนำทางไปรอบ ๆ โครงสร้าง dir ที่ลึก

นี่คือการตรัสรู้ที่แท้จริง
Manuel Ferreria

69

ฉันเพิ่งค้นพบpvคำสั่ง (ไปป์) ซึ่งเป็นเหมือนแมว แต่มีรายละเอียดการโอน

ดังนั้นแทนที่จะ

$ gzip -c access.log > access.log.gz

คุณสามารถใช้ได้

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

ดังนั้นแทนที่จะไม่รู้ว่าการดำเนินการของคุณจะเสร็จสิ้นตอนนี้คุณจะรู้แล้ว!

ความอนุเคราะห์จาก Peteris Krumins


$ gzip -c access.log> access.log.gz ทำไมไม่เพียง: $ gzip access.log

โอ้ใช้ได้ดี :) ฉันเพิ่งดูตัวอย่างจากเว็บไซต์ของ Peteris
Nick Devereaux

tee(1)ที่ดูเหมือนว่าดีเก่า
Daniel C. Sobral

ยูทิลิตี้ที่มีประโยชน์อย่างยิ่งอย่างหนึ่งที่ฉันมักจะลืมเกี่ยวกับ :-(
Patrick

53
sudo !!

รันคำสั่งก่อนหน้านี้อีกครั้งเป็น root

[คำสั่งยอดนิยมปัจจุบันบนไซต์http://www.commandlinefu.comซึ่งเป็นไซต์ที่มีธีมตามแนวคำถามนี้]


2
การเปิดเผย - ฉันใช้ commandlinefu.com
codeinthehole

9
มันจะช่วยเจ้าชาย 16 ตัวนี้ได้: xkcd.com/149

46

กดCtrl-Rและเริ่มพิมพ์คำสั่ง (หรือส่วนใดส่วนหนึ่งของมัน) - มันค้นหาประวัติคำสั่ง การกดปุ่ม Ctrl-R อีกครั้งจะข้ามไปยังการแข่งขันถัดไปป้อนคำสั่งที่แสดงในปัจจุบันและลูกศรขวา (อย่างน้อย) จะช่วยให้คุณแก้ไขได้ก่อน

$ (reverse-i-search)`svn': svn status

ฉันใช้ Linux เป็นเวลา 7 ปีเป็นระบบปฏิบัติการหลักก่อนที่จะเรียนรู้สิ่งนี้ แต่ตอนนี้ฉันรู้แล้วมันมีประโยชน์มาก


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

Ctrl-S ข้ามไปยังการแข่งขันถัดไป คุณอาจต้องทำstty -ixonก่อนเพื่อปิดความหมายการควบคุมการไหลของ XON / XOFF (ซึ่งทำให้ Ctrl-Q พร้อมใช้งานโดยค่าเริ่มต้นจะถูกแมปให้เหมือนกับ Ctrl-V ที่ยกมาแทรก แต่คุณสามารถเปลี่ยนเป็นอย่างอื่นได้ ) ดูman sttyและman readlineสำหรับข้อมูลเพิ่มเติม sttyคำสั่งที่สามารถเพิ่มไปของคุณ~/.bashrc
เดนนิสวิลเลียมสัน

45

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

ฉันใช้เชลล์เป็นเวลาหลายปีในการพิมพ์ชื่อไดเรกทอรีด้วยมือ วันหนึ่งฉันกำลังดูเพื่อนสับสนอยู่ในระบบและเขาก็กดปุ่มแท็บ ฉันถาม "ทำไมคุณกดปุ่มแท็บ?" คำตอบ: มันพยายามทำให้ไดเรกทอรีหรือชื่อไฟล์สมบูรณ์ ใครจะเดาได้ - การแท็บเสร็จสมบูรณ์! พิมพ์ไฟล์หรือไดเรกทอรีสักเล็กน้อยแท็บ Hit และมันจะพยายามทำสิ่งที่คุณพิมพ์ให้เสร็จ

วันหนึ่งเพื่อนบอกว่ากำลังดูฉันที่บรรทัดคำสั่งและดูฉันพิมพ์บางสิ่งเช่น:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

ใครจะเดาได้! เขาไม่เคยรู้เกี่ยวกับ/popd pushdคิดว่าเราเป็น ...


1
สำหรับฉันแล้วการทำให้แท็บสมบูรณ์ดูเหมือนสิ่งที่ "ชัดเจน" ธรรมดามาก แต่ฉันไม่เคยรู้เกี่ยวกับป๊อป / พุชเหมือนกัน ตลกแน่นอน :)
Jonik

3
ดูคำตอบนี้เพื่อให้แท็บกรอกข้อมูลได้มากกว่าคำสั่งไฟล์และไดเรกทอรี: stackoverflow.com/questions/603696//603919#603919
Jonik

1
เป็นเช่นนั้นจริง ๆ. ฉันเรียนรู้เกี่ยวกับการย้อนหลัง - ประวัติการค้นหา (ctrl-r) ของ bash โดยการดูใครซักคน ต่อมาฉันก็รู้ว่ามันเป็นคุณสมบัติ readline และทำงานเหมือนกันในโปรแกรมอื่น ๆ ที่รวม readline (mysql, gdb, python -i, clisp เป็นต้น)
sigjuice

2
คุณจะใช้ "เปลือก" เป็นเวลาหลายปีและไม่รู้เกี่ยวกับการเติมแท็บได้อย่างไร
prestomation

เมื่อจัดการกับ pushd / popd ไม่ลืมที่จะพูดถึงคำสั่งdirs มันแสดงให้เห็นสิ่งที่อยู่ใน pushd / popd stack
slm

41

เรียนรู้เป็นกลุ่ม

มันเป็นตัวแก้ไขที่ดีที่สุด แต่แน่นอนที่สุดคือตัวแก้ไขที่ดีที่สุดที่มีอยู่ในเซิร์ฟเวอร์ Linux ที่เปลือยเปล่า


1
gvim ยังเป็นเบราเซอร์ไฟล์ที่ดีที่สุดบน windows;)

นอกจากนี้ยังมีประโยชน์อย่างมากเมื่อคุณรู้ว่าเป็นกลุ่มคุณสามารถใส่กระสุนส่วนใหญ่เข้าสู่โหมด vi และการนำทางจะง่ายและรวดเร็วมาก
Patrick

38

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

$ your_command_here & disown

คุณสามารถแยกโปรแกรมที่กำลังทำงานอยู่ออกได้:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
การใช้หน้าจอนั้นยอดเยี่ยมเพราะคุณสามารถ "เชื่อมต่อใหม่" กับแอปนั้นจากที่ไหนก็ได้ในภายหลัง
prestomation

+1 ฉันไม่เคยได้ยินเรื่องการปฏิเสธ
user18911

เหมือนกันอีกครั้งบอกปัด แต่ฉันไม่อยู่แล้วทำเช่นเดียวกันกับหน้าจอ
แอนดี้

38

เมื่อฉันต้องการตรวจสอบให้แน่ใจว่าฉันใช้คำสั่งจริงไม่ใช่นามแฝงฉันใช้แบ็กสแลชนำหน้า:

\rm -rf ~/tmp

สิ่งนี้เหมือนกับ "command rm -rf ~ / tmp" หรือไม่
Maxim Veksler

ฉันไม่ทราบ "คำสั่ง" แต่ดูเหมือนกัน
mouviciel

4
ใช่ใช่เว้นแต่ "คำสั่ง" ไม่ใช่นามแฝงซึ่งในกรณีนี้คุณจะต้องใช้ \ command rm -rf ~ / tmp ในกรณีนั้น \ rm -rf ~ / tmp ดีกว่า
4252 Jamol

@presario และคุณคิดว่าเป็นไปได้ที่จะสร้างนามแฝงสำหรับ "/"? สิ่งที่น่าเสียดายที่ผมไม่สามารถแสดงความคิดเห็น upvote :)

ดูคำสั่งที่คล้ายกัน " builtin"
Dennis Williamson

38

เคล็ดลับนี้จะทำให้ CLI ของคุณสะดวกสบายขึ้น (อย่างน้อยก็ทำให้ฉัน):

สร้างไฟล์ ~ / .inputrc โดยมีเนื้อหาดังต่อไปนี้:

"\e[A": history-search-backward
"\e[B": history-search-forward

โหลด bash ซ้ำ (เช่นโดยพิมพ์ "exec bash") เมื่อคุณพิมพ์คำนำหน้าของคำสั่งและกดลูกศรขึ้นคุณจะเรียกดูคำสั่งที่เริ่มต้นด้วยคำนำหน้าของคุณตัวอย่างเช่นถ้าคุณพิมพ์ ssh มันจะแสดงการเชื่อมต่อเดิมของคุณด้วยเปลือกระยะไกล หากพรอมต์ของคุณว่างเปล่าลูกศรขึ้นจะเรียกดูประวัติตามปกติ


3
ฉันมักจะผูกเหล่านั้นไปยัง \ E [5 ~ และ \ E [6 ~ (aka PageUp และ PageDown) แทน rebinding ลูกศร, แต่มันจะสะดวกกว่า Ctrl-R / Ctrl-S :)
ephemient

+1 ฉันมีสิ่งเหล่านี้ผูกพันกับ F8 และ Shift-F8 เพื่อเลียนแบบ cmd.exe แต่ใช้หลักการเดียวกันนี้
user18911

4
+1 สำหรับexec bash
Dennis Williamson

นอกจากนี้ยังเป็นการศึกษาเพื่ออ่านman readlineและจดจำทางลัดเริ่มต้นของ
SaveTheRbtz

คุณยังสามารถทำการbind -f ~/.inputrcรีโหลดอินพุตโดยไม่ต้องเริ่มการทุบตีใหม่และล้างสภาพแวดล้อมปัจจุบันของคุณ
Patrick

36

ใช้&&แทน;เมื่อดำเนินการหลายคำสั่งพร้อมกัน มันหยุดเมื่อเกิดข้อผิดพลาดและไม่ดำเนินการคำสั่งอื่น ๆ

ตัวอย่างคลาสสิก:

./configure && make && make install

1
การปฏิบัตินี้ underrated มาก! ควรเป็นมาตรฐานการปฏิบัติเพื่อจบแต่ละบรรทัดของเชลล์สคริปต์ด้วย && และใช้ "true" เป็นคำสั่งสุดท้าย
user18911

3
สิ่งที่ตลกคือฉันไม่รู้เกี่ยวกับ ';' คำสั่งก่อน - ฉันเคยใช้ '&&' เสมอ
Nick Klauer

4
คุณสามารถเริ่มเชลล์สคริปต์ด้วย "#! / bin / sh -e" สิ่งนี้จะหยุดหากว่าสายใด ๆ ล้มเหลว
stribika

3
คุณสามารถใช้ไพพ์คู่สำหรับประโยค "else":dosomething && echo "success" || echo "teh fail"
Dennis Williamson

2
มีข้อความเมื่อเร็ว ๆ นี้เกี่ยวกับ Planet Debian ว่าเป็นวิธีปฏิบัติที่ไม่ถูกต้องที่จะใช้ -e ในบรรทัด shebang ใช้ set -e แทนเนื้อความของสคริปต์แทน วิธีนี้สคริปต์จะไม่ทำงานแตกต่างกันหากมีคนใช้ในชื่อ sh $ filename
ptman

32

เมื่อเขียนลูปบนบรรทัดคำสั่งใน bash ฉันมักจะนำหน้าคำสั่งที่มีความเสี่ยงด้วยคำสั่ง 'echo'

for item in items; do echo something-risky; done

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

'set -x' เปิดใช้งานการแก้ไขข้อบกพร่อง ดูhttp://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.htmlสำหรับข้อมูลเกี่ยวกับการดีบัก bash


3
ฉันทำเช่นนี้ด้วยเคล็ดลับที่มีประโยชน์มาก!
user18911

1
+1 นี่สามารถช่วยชีวิต! หรือตัวประหยัดข้อมูล ...
David Oneill

31

ความต้องการ

คุณต้องทดสอบแบนด์วิดท์สูงสุดระหว่าง 2 เซิร์ฟเวอร์


วิธีการแก้

บนSERVER1ทำ:

nc -u -l 54321 > /dev/null

บนSERVER2ทำ:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

คุณจะเห็นผลลัพธ์เช่น:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB / sเป็นปัจจัยที่น่าสนใจที่นี่ซึ่งแสดงแบนด์วิดธ์การถ่ายโอนเครือข่ายจริง

คำอธิบาย :

เมื่อแพ็กเก็ตเริ่มไหลผ่านเครือข่ายคุณจะสามารถดูสถิติแบนด์วิดท์บน SERVER2 ซึ่งเป็นการประมาณการที่ดีของแบนด์วิดท์สูงสุดที่เป็นไปได้จริงระหว่างเซิร์ฟเวอร์ 2 แห่ง

คัดลอกโดย UDP (เพื่อป้องกันค่าใช้จ่าย TCP)

การคัดลอกไปยังจากหน่วยความจำ (/ dev / ศูนย์) บน SERVER1 ไปยังหน่วยความจำ (/ dev / null) บน SERVER2 จึงป้องกันไม่ให้ดิสก์ I / O กลายเป็นคอขวด


4
ตรวจสอบให้แน่ใจว่าไม่ได้กำหนดค่า ssh ให้ใช้การบีบอัดใน. ssh / config ' มิฉะนั้นคุณจะได้รับหมายเลขที่ดีจริงๆที่อยู่ห่างไกลมากจากความจริง ;-)
โจอาคิมซาวเออร์

ใช่แล้ว และ SSH กำลังจะทำการเข้ารหัสและถอดรหัสซีพียูของคุณซึ่งจะเป็นการโยนตัวเลขออกไป

ใช้ netcat แทน
bendin

+1 สำหรับ netcat ค่าใช้จ่ายของ SSH จะเอียงหมายเลขของคุณ
Mikeage

ปรับปรุงใหม่เพื่อแก้ไขข้อเสนอแนะโดย @saua, @Daniel Von Fange และ @bendin ขอบคุณสำหรับคำแนะนำของคุณ
Maxim Veksler

23

การเห็นโครงสร้างไดเรกทอรีสีง่ายขึ้น

alias ls="ls --color=tty"

แก้ไข

alias ls="ls --color=auto"

5
ฉันชอบ --color = auto เพราะไม่ได้ส่งตัวควบคุมขยะหากเปลี่ยนเส้นทางไปยังไฟล์คุณสามารถใช้นามแฝง grep = "grep --color = auto" เพื่อให้มีการเน้นรูปแบบการจับคู่

+1 สำหรับ --color = auto; บางคนสามารถเพิ่มคำตอบด้วยสิ่งนั้นได้ไหม
Jonik

ฉันคิดว่า tty ทำสิ่งเดียวกันกับรถยนต์ที่นี่
joshudson

อัปเดตเพื่อให้สะท้อนถึงสี = auto
Suroot

น่าแปลกที่การระบายสีทำให้ฉันอ่านน้อยลงมาก ตัวอย่างเช่นสีเหลืองบนสีขาวไม่ใช่ตัวเลือกการระบายสีที่ดี

20

พอยน์เตอร์ขนาดเล็กบางตัวเกี่ยวกับการดูบันทึก:

  1. คุณสามารถใช้tail -Fเพื่อเฝ้าดูบันทึกหลังจากถูกตัดทอน (ตัวอย่าง log4j)
  2. คุณสามารถใช้งานได้น้อยลง: เปิดน้อยลงคลิกSHIFT + Fเพื่อเลียนแบบพฤติกรรมหาง การรวมกันที่มีประโยชน์คือ-Sเพื่อปิดการใช้งานการตัดบรรทัด น้อยจะช่วยให้คุณค้นหาในบันทึก

1
และด้วยtail -fคุณสามารถดูบันทึกหลายรายการพร้อมกัน! เช่น:tail -f log1.txt -f log2.txt
Stu Thompson

@StuThompson: ขอบคุณ ไม่ทราบว่า นอกจากนี้คุณอาจต้องการชำระเงินvanheusden.com/multitail
Maxim Veksler

20

ฉันได้เรียนรู้เคล็ดลับจากเพื่อนนาน ๆ แล้วเพื่อเปลี่ยนนามสกุลไฟล์ได้อย่างง่ายดาย:

mv my_filename.{old,new}

การขยายตัวของเชลล์จะขยายสิ่งนี้เป็น:

mv my_filename.old my_filename.new

นอกจากนี้ยังสามารถใช้เพื่อเปลี่ยนชื่อไฟล์ด้วยวิธีอื่นเช่นเพิ่มบางสิ่งใน:

mv my_{,cool_}filename

6
อย่าลืมใส่สัญลักษณ์แทนหรือการแสดงออกของรูปแบบอื่น ๆ ในคำสั่งเดียวกันมิฉะนั้น glob อาจขยายไปสู่การโต้แย้งมากกว่า 2 ข้อ! mv *. {เก่าใหม่} น่าจะให้ผลลัพธ์ที่น่าประหลาดใจจริงๆ

ใช่ตกลง - นี้เป็นข้อแม้สำคัญ :)

2
ตัวอย่างเช่นคุณสามารถพิมพ์ls -l /bin/cจากนั้นกด Alt-Shift- {และมันจะทำสิ่งนี้ให้ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}คุณ
Dennis Williamson

19

ใช้ "tar xf" เพื่อแยกไฟล์บีบอัด j สำหรับ bzip2 และ z สำหรับ gzip ไม่จำเป็นเนื่องจาก tar จะตรวจจับชนิดไฟล์ของไฟล์เก็บถาวรของคุณ ไม่มีเครื่องหมาย '-' หน้าอาร์กิวเมนต์ คุณจะประหยัดเวลาได้มาก (กว่าพันปี ;-))

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


ใช่ฉันมีalias ut="tar xf"- ทำให้การแยกเก็บถาวรง่ายยิ่งขึ้น
David Wolever

สิ่งนี้จะล้มเหลวในการกระจาย RHEL บางอย่างถ้าคุณใช้พวกเขา
pvsnp

น้ำมันดินใหม่ยังมีสวิตช์ "J" สำหรับการบีบอัดไปยังไฟล์เก็บถาวร xz (7zip based)
Hubert Kario

หรือติดตั้ง UNP: packages.debian.org/sid/unp ฉันเดาว่ามันคล้ายกับเลิกทำ
Zitrax

17

ติดตั้งแพคเกจ bash-completion มันมีจำนวนกฎการเติมเต็มที่กำหนดไว้ล่วงหน้าสำหรับเชลล์ เปิดใช้งานโดยพิมพ์ "source / etc / bash_completion" หากคุณ distro ไม่ได้ทำเพื่อคุณ จากนั้นเช่นเมื่อใดก็ตามที่คุณทำตาม kpdf คุณจะเห็นรายการไดเรกทอรีและไฟล์ PDF เท่านั้น มันฉลาดเท่าที่จะทำไฟล์รีโมตหลังจาก scp ssh: // server / XXX (ถ้าคุณเปิดใช้งานการเข้าสู่ระบบแบบไม่ใช้รหัสผ่าน)


17

ฉันใช้สิ่งเหล่านี้ตลอดเวลา

Alt- (ESC +. ในบางเทอร์มินัล) คัดลอกอาร์กิวเมนต์ที่ใช้ล่าสุด (มีประโยชน์มาก)

CTRL-W ลบคำ

CTRL-L เทอร์มินัลที่ชัดเจน (เช่นคำสั่งที่ชัดเจน แต่เร็วกว่า)

ALT-B (ESC + B ในบางเทอร์มินัล) เลื่อนไปข้างหลังหนึ่งคำ

ALT-F (ESC + F ในบางเทอร์มินัล) เลื่อนไปข้างหน้าคำ

CTRL-E ข้ามไปที่ EOL

CTRL-A ข้ามไปที่ BOL

ค้นหา CTRL-R ในประวัติศาสตร์


1
ขอบคุณสำหรับการแบ่งปันทางลัด! ฉันไม่ได้รับ ALT-B / F เพื่อทำงานใน Mac
LéoLéopold Hertz 준영

ผู้ชายที่ยอดเยี่ยม ....
Daud Ahmad Khokhar

16

ในทุบตีฉันใช้! $มาก มันซ้ำอาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้าย:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

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

ฉันรู้ว่าพวกเขาถูกกล่าวถึง แต่ฉันใช้เสียงเรียกเข้าหน้าจอและ cd - มาก

ฉันลืม noclobber:

set -o noclobber

จากคนทุบตี :

หากตั้งค่า bash จะไม่เขียนทับไฟล์ที่มีอยู่ด้วยตัวดำเนินการ>,> & และ <> สิ่งนี้อาจถูกเขียนทับเมื่อสร้างไฟล์เอาต์พุตโดยใช้โอเปอเรเตอร์การเปลี่ยนเส้นทาง> | แทน>


6
ฉันไม่ได้ใช้ $! เพราะมันง่ายที่จะอ้วน แต่ก็ชอบกดปุ่ม ^ - (escape-period) เพื่อให้ได้ผลเหมือนกัน
David Wolever

7
คุณสามารถทำได้Alt-.เช่นกันทั้งนี้ขึ้นอยู่กับคีย์บอร์ดของคุณ
Dennis Williamson

Omg, การสำเร็จความใคร่จิ๋ว, เดนนิส!
artifex

14

เปลี่ยนจาก bash เป็นzshและดูการปรับปรุงประสิทธิภาพของคุณ:

  • ฉลาดจริง ๆ เสร็จสิ้นแท็บสคริปต์ มันเสร็จสมบูรณ์ไม่เพียงบรรทัดคำสั่ง แต่ตัวเลือกทั้งหมดชื่อของหน้าคนชื่อแพคเกจ (สำหรับ apt-get / emerge ฯลฯ ) และสิ่งที่มีคุณ และให้คำอธิบายที่เป็นประโยชน์เกี่ยวกับตัวเลือกต่างๆในระหว่างการดำเนินการให้เสร็จสิ้น ทั้งหมดนี้โดยไม่ต้องใช้พื้นที่เลื่อนใด ๆ หลังจากคำสั่งได้รับการออก
  • การเติมแท็บของ wildcard ให้สมบูรณ์ เขียน cat * .txt กดแท็บแล้วเลือกระหว่างไฟล์ใดก็ได้ที่ตรงกับนิพจน์
  • สลับไดเรกทอรีเพียงแค่พิมพ์ชื่อ
  • โหมดตัวแก้ไขบรรทัดหลายโหมด สามารถทำตัวเหมือน vi หรือ emacs ได้หากต้องการ
  • การเชื่อมโยงคีย์ที่ปรับแต่งได้เพื่อทำสิ่งที่คุณต้องการ
  • การแจ้งเตือนแบบมีธีมรวมถึงความสามารถในการใส่ข้อมูลพรอมต์ทางด้านขวาของหน้าจอและซ่อนอัตโนมัติเมื่อพิมพ์คำสั่งยาว

Google จะบอกคุณประโยชน์มากมาย


1
คุณควรให้มากกว่าลิงค์ ฟังดูน่าสนใจ แต่ขายให้ฉันคน!

พวกเขาจัดการเพื่อรวมการสนับสนุน Unicode หรือไม่?

@Cory เอาล่ะฉันก็ไม่ได้ต้องการที่จะขโมยความคิดและมันให้ความรู้สึกที่ซ้ำซ้อนในการเขียนของตัวเองเมื่อมีมากสิ่งที่ดีที่เขียนโดยคนอื่น ๆ อยู่แล้ว :)

@kyku ใช่มีการสนับสนุน Unicode ที่เหมาะสมตั้งแต่อาจจะปี

ดูเท่ ฉันจะให้มันยิง!

13

โรงเรียนเก่าย้ายต้นไม้ไดเรกทอรีจากที่หนึ่งไปยังอีกที่หนึ่งรักษา symlink สิทธิ์และสิ่งที่ดีทั้งหมด:

tar cBf - . | (cd /destination; tar xvBpf -)

หรือผ่านเครือข่าย

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

โรงเรียนใหม่:

rsync -urltv . /destination

หรือผ่านเครือข่าย

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) พิมพ์น้อยกว่าเล็กน้อยและใช้งานง่ายกว่า ssh
ephemient

1
-a เป็นเช่นเดียวกับ '-rlptgoD' - นั่นคือ recurse คัดลอก symlinks เป็น symlink, รักษา perms, รักษา timestamps, รักษากลุ่ม, รักษาเจ้าของ, คัดลอกไฟล์อุปกรณ์และไฟล์พิเศษเป็นอุปกรณ์และไฟล์พิเศษ นอกจากนี้ระหว่างเครื่อง -z (บีบอัดไฟล์ก่อนส่งให้ขยายขนาดหลังจากได้รับ) มีประโยชน์ rsync -avz [-e ssh] คือเพื่อนของคุณ :-)
dr-jan

-z ทำสิ่งใดได้ดีกว่า ssh หรือไม่? ฉันจะไม่คิดอย่างนั้น
Paul Tomblin

rsync -avhดีที่สุดในเครื่องเดียว - สร้างความhมั่นใจว่าฮาร์ดลิงก์ถูกถ่ายโอนอย่างถูกต้องโดยไม่ต้องเปลี่ยนแต่ละลิงก์เป็นไฟล์แยกต่างหากแม้ว่าคุณจะมีไฟล์จำนวนมหาศาล แต่ก็สามารถใช้หน่วยความจำได้จำนวนมาก rsync -avzh . foo.com/destinationเทียบเท่ากับเครือข่ายและโดยปกติคุณไม่จำเป็นต้องใช้-e sshเพราะ rsync จะรู้ว่าใช้ ssh
RichVel

จริงๆแล้วทุกวันนี้ฉันกำลังใช้อยู่rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

ความต้องการ : คุณมีไดเรกทอรีที่มีรายการไฟล์จำนวนมากที่คุณต้องการลบ rm -r จะล้มเหลว!

ตัวอย่าง

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

วิธีแก้ปัญหา :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

คำอธิบาย :

แก้ไข: แก้ไขคำอธิบายตามความคิดเห็น @ephemient

find จะส่งอาร์กิวเมนต์ไปยัง rm โดยอาร์กิวเมนต์สูงสุดที่อนุญาต สิ่งนี้จะช่วยให้ rm สามารถลบไฟล์ในแบตช์ซึ่งเป็นเทคนิคที่เร็วที่สุดที่ฉันรู้โดยไม่ต้องใช้การดำเนินการ -delete ในการค้นหาตัวเอง มันเทียบเท่ากับ

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

ที่คุณอาจพบว่ามีประโยชน์ถ้าคุณไม่สนับสนุนfind-exec ... +


5
แทนที่\;ด้วย+: จากนั้นfindจะทำสิ่งที่xargsทำตามค่าเริ่มต้นซึ่งเป็นชุดค่าอาร์กิวเมนต์มากที่สุดเท่าที่จะทำได้ (โดยไม่ต้องทำงานเกินขีด จำกัด รายการอาร์กิวเมนต์) หรือเพียงแค่ใช้-deleteIntead ของ-exec rm(GNU Findutils จำเป็นสำหรับทั้งสอง)
ephemient

คำแนะนำที่ดี - ฉันไม่รู้ '+'
codeinthehole

@ephemient: ความคิดเห็นที่ดีฉันได้แก้ไขโพสต์
Maxim Veksler

2
น่าสนใจฉันไม่เคยได้ยิน '+'
user18911

หรือเพียงแค่find ... -deleteถ้าการค้นหาของคุณเป็นที่รัก
David Wolever

11

ฉันใช้เคล็ดลับสองข้อนี้บ่อยครั้งจนฉันคิดว่าควรแบ่งปัน:

!foo

จะเรียกใช้คำสั่งสุดท้ายในไฟล์ประวัติที่ขึ้นต้นด้วย "foo" (ฉันมักจะใช้มันเมื่อคอมไพล์!gccเช่น)

อีกอันหนึ่งเป็นแป้นพิมพ์ลัด (Ctrl + O แทน Return) ซึ่งจะดำเนินการคำสั่งและแสดงคำสั่งถัดไปในไฟล์ประวัติ ตัวอย่างเช่นเมื่อฉันรวบรวมและทดสอบไฟล์ฉันมักจะทำ 3 หรือ 4 คำสั่ง, make, cd กับ dir ของการทดสอบ, รันการทดสอบ, cd ถึง dir ของ makefile การใช้ Ctrl + O ทำให้งานนี้ง่ายขึ้นมาก :)

หวังว่าจะช่วยได้!


1
+1 สำหรับ Ctrl-O
Dennis Williamson

10

วิธีการใช้การโค่นล้มใน Linux โดยปราศจากความช่วยเหลือของอินเตอร์เฟสกราฟิกแฟนซีที่อาจไม่สามารถใช้ได้

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

สิ่งนี้ทำให้นักพัฒนาจำนวนมากกลับมาใช้ Linux อีกครั้งอย่างแปลกประหลาด


rapidsvn เป็น gui ตัวน้อยที่ดีสำหรับ svn ภายใต้ Linux

แฟนซีหลาย GUIs ที่มีประสิทธิภาพอย่างแน่นอนพร้อมใช้งาน (เช่นว่าในความคิด IntelliJ) แต่ผมชอบความเป็นไปได้ของการใช้อย่างใดอย่างหนึ่งเหล่านั้นหรือบรรทัดคำสั่ง (ยังมีประสิทธิภาพ แต่ differrently) - แล้วแต่จำนวนใดจะเหมาะสมกับสถานการณ์ในปัจจุบันดีกว่า
Jonik

รายการโปรดของฉันคือ NautilusSVN (เหมือน TortoiseSVN): code.google.com/p/nautilussvn
7655

10

คำสั่งโรงเรียนเก่าที่ถูกมองข้ามมากที่สุด: find

เมื่อวานนี้ฉันซ่อมแซมข้อผิดพลาดการอนุญาตขั้นต้น:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

ใช่ เรียนรู้คำสั่ง find ค้นหาผสมกับ xargs, sed และ awk ทำให้เป็นผู้นำในการประมวลผลไฟล์!
Jonathon Watney

ตกลงกัน! แม้ว่าฉันจะไม่เคยจำอะไรเกี่ยวกับความกลัวและความหวาดกลัว - ฉันจำเป็นต้องเรียนรู้อีกครั้ง! ฉันควรพิมพ์ cheatsheet ออกมาจริงๆ

ใช่ แต่อย่าลืมใช้ -print0 และ -0 ตัวเลือกเพื่อ xargs เพื่อหลีกเลี่ยงปัญหายุ่งยากที่เกี่ยวข้องกับชื่อไฟล์ที่มีอักขระผิดปกติ (เช่นแบ็กสแลช)
user18911

Yup อาจจะครึ่งเวลาที่ผมใช้พบว่ามันเป็นเรื่องที่จะแก้ไขสิ่งที่ได้รับอนุญาตโง่: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
เดวิด Wolever

1
อย่าลืมตัว-permเลือกในfindการค้นหาไฟล์ที่มีการอนุญาตที่ถูกต้อง
Dennis Williamson

8

สำหรับเชลล์เช่นbashและkshคุณสามารถทำให้บรรทัดคำสั่งตอบสนองต่อคำสั่งการนำทางเช่นตัวแก้ไขข้อความของคุณ:

set -o emacs

หรือ

set -o vi

จะช่วยให้คุณค้นหาประวัติของคุณและย้ายเกี่ยวกับบรรทัดคำสั่งในแบบที่คุณคุ้นเคยกับการทำไฟล์ข้อความ (เช่นในโหมด vi การกดESCจากนั้นการพิมพ์/stringจะค้นหาคำสั่งก่อนหน้าของคุณสำหรับ "string" - คุณสามารถใช้nและNย้าย ระหว่างการแข่งขัน)


ตัวพิมพ์เล็ก: "ตัวแก้ไขการทดสอบ" ควรเป็น "ตัวแก้ไขข้อความ"

8

grep คือเพื่อนของฉัน อย่างจริงจัง.

รายการ.rbไฟล์ที่มีข้อความclass foo:

grep -l "class foo" .rb

รายการ.rbไฟล์ที่ไม่มีข้อความclass foo:

grep -L "class foo" *.rb

รายการ.rbไฟล์ที่ไม่มี foo หรือ bar (คุณสามารถใช้ regexp กับ -e แต่คุณต้องหลบเลี่ยงโอเปอเรเตอร์):

grep -L -e "foo\|bar" *.rb

คุณอาจสนใจเครื่องมือที่เรียกว่า "ack" ซึ่งทำเช่นเดียวกันกับ grep แต่จะสแกนไฟล์ต้นฉบับแบบเรียกซ้ำ ลองดูสิ (ฟรี): betterthangrep.com

8

การทดแทนเชลล์ดำเนินการด้วย^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
ที่จริงฉันชอบ "!!: gs / foo / bar" เนื่องจากฉันมักจะพบว่า foo ถูกกล่าวถึงมากกว่าหนึ่งครั้งในคำสั่งก่อนหน้าและฉันต้องการทดแทนทั่วโลก (เช่น "mv foo.txt foo.bak")
user18911
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.