อะไรคือเคล็ดลับบรรทัดคำสั่งเดียวที่คุณโปรดปรานมากที่สุดโดยใช้ Bash [ปิด]


156

เราทุกคนรู้วิธีใช้<ctrl>-Rเพื่อย้อนกลับการค้นหาผ่านประวัติ แต่คุณรู้หรือไม่ว่าคุณสามารถใช้<ctrl>-Sเพื่อส่งต่อการค้นหาถ้าคุณตั้งค่าstty stop ""? นอกจากนี้คุณเคยลองใช้การผูก -p เพื่อดูแป้นพิมพ์ลัดทั้งหมดในรายการหรือไม่ มีมากกว่า 455 สำหรับ Mac OS X โดยค่าเริ่มต้น

อะไรคือเคล็ดลับที่คลุมเครือที่สุดที่คุณโปรดปรานแป้นพิมพ์ลัดหรือการกำหนดค่า shopt โดยใช้ bash?


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

> โปรดใส่คำพูดนี้ซ้ำเพื่อพูดว่า "สิ่งใดที่คุณโปรดปรานมากที่สุด" เสร็จสิ้น
Martin Klinke

1
มีโคลน StackOverflow สำหรับคำถามนี้มากคือcommandlinefu.com
RKB

มีเพียง 232 จากการผูกคีย์เริ่มต้น 455 รายการเท่านั้นที่นอกเหนือจาก "การแทรกตัวเอง" ("พิมพ์คีย์นี้"): $ bind -p | grep -v การแทรกตัวเอง | wc
Ed Brannin

บางสิ่งที่เรียบร้อยในที่นี่ แต่มันควรจะตั้งข้อสังเกตว่าค่อนข้างน้อยของพวกเขาเท่านั้นทำงานเมื่อทุบตีอยู่ในโหมด emacs ...
โม

คำตอบ:


157

การเปลี่ยนชื่อ / ย้ายไฟล์ด้วยคำต่อท้ายอย่างรวดเร็ว:
cp /home/foo/realllylongname.cpp{,-old}

สิ่งนี้ขยายเป็น:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


12
! น่ากลัว ตอนนี้ฉันต้องลองและจดจำสิ่งนี้
Jon Ericson

9
เพียงเพื่อชี้ให้เห็นว่าการทำสิ่งย้อนกลับ (จาก. cpp- เก่าไป. cpp) คุณจะทำ cp /home/foo/realllylongname.cpp{-old,}
Michael Ekoka

ชัดเจนในการหวนกลับ แต่ฉันไม่คิดว่าฉันจะจำได้ด้วยตัวเอง ขอบคุณ!
Zecc

150
cd -

มันเทียบเท่ากับบรรทัดคำสั่งของปุ่มย้อนกลับ (พาคุณไปยังไดเรกทอรีก่อนหน้านี้ที่คุณอยู่)


6
ฉันชอบที่จะใช้pushdและpopdเพื่อรักษาไดเรกทอรีสแต็คด้วยตัวเอง
Alex M

21
แต่ 'cd -' มีข้อดีของการทำงานแม้ว่าคุณจะไม่ได้ใช้ pushd ก็ตาม
Sergio Acosta

10
เป็นมูลค่าการกล่าวขวัญว่า 'cd' จะนำคุณไปยังไดเรกทอรีบ้านของคุณ
dr-jan

เป็นที่น่าสนใจว่านี่จะไม่ปรากฏในman cdหรือcd --help(อย่างน้อยฉัน)
Halil Özgür

135

รายการโปรดอีก:

!!

ทำซ้ำคำสั่งสุดท้ายของคุณ มีประโยชน์มากที่สุดในรูปแบบ:

sudo !!

81
มันมีประโยชน์เพิ่มเติมในการทำให้คุณฟังก็โกรธด้วยเช่นกัน "คอมพิวเตอร์ทำสิ่งนี้" "ปฏิเสธการเข้าใช้". "ทำมัน!!"
nickf

นั่นไม่ได้เป็นที่รู้จักกันน้อย! :-)
hoyhoy

10
สิ่งที่คล้ายกันคุณสามารถทำได้: mkdir testdir; cd !$.. สิ่งนี้จะทำงานcd [last word of previous line](ในตัวอย่างcd testdir)
dbr

13
Make Me A Sandwich Sudo !!
Kibbee

ถ้าคุณชอบ !!,! $ และ! -1: ^ foo ^ bar คุณจะต้อง "ผูก Space: magic-space" stackoverflow.com/questions/603696/…
Yoo

81

สิ่งที่ฉันชอบคือ '^ string ^ string2' ซึ่งใช้คำสั่งสุดท้ายแทนที่สตริงด้วย string2 และดำเนินการ

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

คู่มือประวัติบรรทัดคำสั่ง Bash


นี่ไม่ใช่โลภ ฉันจะทำให้มันโลภได้อย่างไร
Altreus

9
!!:gs/ehco/echo/
andre-r

หน้า 2 ของคู่มือนั้นมีความจำเป็น
jmoz

1
@ andre-r: !!:gs/ehco/echo/ทำการค้นหาทั่วโลกและแทนที่คำสั่งสุดท้าย (มอบให้!!ในstackoverflow.com/questions/68372/… ) นั่นไม่เทียบเท่ากับ^ehco^echoที่เพิ่งแทนที่อินสแตนซ์หนึ่งของ "ehco" - การตอบสนองที่แม่นยำยิ่งขึ้นก็!!:s/ehco/schoคือ
Iceland_jack

64

เปลี่ยนชื่อ

ตัวอย่าง:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

มีประโยชน์มาก


3
ว้าวฉันเป็นคนปัญญาอ่อนมาหลายปีแล้วโดยใช้เทคนิคบาเนม, mv และ {} เพื่อทำสิ่งนี้ / foreheadsmack
Gregg Lind

7
การเปลี่ยนชื่อไม่ได้เป็นการเฉพาะ / bash / readline เหมือนโพสต์อื่น ๆ
ปืน

1
zmv จากการกระจาย zsh นั้นดีกว่ามากในกรณีส่วนใหญ่
ZyX

util-linux-ngมีคำสั่งเปลี่ยนชื่อด้วยเช่นกันและมันก็ไม่เหมือนที่กล่าวไว้ในคำตอบ คำสั่งที่อธิบายไว้ที่นี่เป็นจริงMMV
Cristian Ciupitu

60

ฉันเป็นแฟนของที่!$, !^และ!*expandos กลับมาจากที่ผ่านมาสายมากที่สุดคำสั่งส่ง: รายการสุดท้ายรายการที่ไม่ใช่คำสั่งแรกและทุกรายการที่ไม่ใช่คำสั่ง หากต้องการปัญญา (โปรดทราบว่าเชลล์พิมพ์คำสั่งก่อน):

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

นี้มีประโยชน์เมื่อคุณพูดls filea filebและต้องการที่จะแก้ไขอย่างใดอย่างหนึ่งของพวกเขาหรือทั้งสองของพวกเขาvi !$ vimdiff !*นอกจากนี้ยังสามารถพูดคุยกับ " nอาร์กิวเมนต์ th" เช่น:

$ echo foo bar baz
$ echo !:2
echo bar
bar

สุดท้ายด้วยชื่อพา ธ คุณสามารถเข้าไปที่ส่วนใดส่วนหนึ่งของพา ธ ได้ด้วยการต่อท้าย:hและ:tไปยังส่วนขยายใด ๆ ข้างต้น:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

'echo !! 2' ไม่ทำงานสำหรับฉันและจากการโพสต์ในภายหลังฉันเห็นว่าฉันคิดว่ามันควรจะเป็น: 'echo
!:

8
เพิ่ม "bind Space: magic-space" ไปยัง. bashrc และอื่น ๆ ! ชุดค่าผสมจะถูกขยายโดยอัตโนมัติเมื่อคุณกด Space
Yoo

47

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

$ mkdir /tmp/new
$ cd !!:*

บางครั้งแทนที่จะใช้การค้นหาฉันจะแยกลูปหนึ่งบรรทัดถ้าฉันต้องการรันคำสั่งจำนวนมากในรายการไฟล์

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

การกำหนดค่าตัวเลือกประวัติบรรทัดคำสั่งใน. bash_login ของฉัน (หรือ. bashrc) มีประโยชน์จริง ๆ ต่อไปนี้เป็นโครงร่างของการตั้งค่าที่ฉันใช้กับ Macbook Pro ของฉัน

การตั้งค่าต่อไปนี้ทำให้ bash ลบคำสั่งที่ซ้ำกันในประวัติของคุณ:

export HISTCONTROL="erasedups:ignoreboth"

ฉันยังเพิ่มขนาดประวัติของฉันให้สูงขึ้นอีกด้วย ทำไมจะไม่ล่ะ? ดูเหมือนจะไม่ทำให้อะไรช้าลงในไมโครโปรเซสเซอร์ในปัจจุบัน

export HISTFILESIZE=500000
export HISTSIZE=100000

อีกสิ่งที่ฉันทำคือเพิกเฉยคำสั่งบางอย่างจากประวัติของฉัน ไม่จำเป็นต้องจำคำสั่ง exit

export HISTIGNORE="&:[ ]*:exit"

คุณต้องการตั้งค่า histappend มิฉะนั้น bash จะเขียนทับประวัติของคุณเมื่อคุณออก

shopt -s histappend

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

shopt -s cmdhist

ในที่สุดบน Mac OS X (หากคุณไม่ได้ใช้โหมด vi) คุณจะต้องรีเซ็ต <CTRL> -S จากการหยุดเลื่อน สิ่งนี้จะช่วยป้องกันการทุบตีจากความสามารถในการตีความว่าเป็นการค้นหาไปข้างหน้า

stty stop ""

6
ฉันค้นหา "Alt-." ดีกว่า "!!: *" สำหรับการทำซ้ำคำสุดท้ายของคำสั่งสุดท้าย
Weidenrinde

เพิ่มเติมสำหรับ histroy: 1. บันทึกประวัติอย่างสม่ำเสมอ (ด้วย -a หากคุณมีหลายเชลล์เปิดในครั้งเดียว) ส่งออก PROMPT_COMMAND = "history -a" 2. นามแฝงสำหรับการอ่านประวัติจากเชลล์อื่น ๆ นามแฝง - h = 'history -n; ประวัติศาสตร์ grep '
Weidenrinde

การส่งออก HISTIGNORE = "[] *" ไม่จำเป็นเนื่องจาก HISTCONTROL ของคุณ = ไม่ควรทำเช่นเดียวกัน
Weidenrinde

อีกสิ่งที่ดีสำหรับประวัติศาสตร์: ส่งออก HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde

หากต้องการบันทึกการกดแป้นสองสามครั้งของ "cd !!: *" ให้ลอง "cd! $" "! $" จะถูกตีความว่าเป็นอาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายของคุณ
Tim Stewart

43

จะแสดงรายการเฉพาะไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันได้อย่างไร

ls -d */

มันเป็นกลลวงง่ายๆ แต่คุณจะไม่รู้ว่าฉันต้องใช้เวลาเท่าไหร่ในการหาอันนั้น!


2
ยอดเยี่ยม ตลอดหลายปีที่ผ่านมาสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือalias lsd='ls -F | grep --color /'ซึ่งจะแสดงรายการสิ่งเดียวกัน แต่ในลักษณะที่อ่อนแอกว่า อย่างไรก็ตามมันจะแสดงหนึ่ง dir ต่อบรรทัดเพื่อความสะดวกในการแยกวิเคราะห์ ฉันได้ปรับเปลี่ยนคำสั่งของคุณให้ทำเช่นเดียวกัน:ls -d1 */
Artem Russakovskii

มันทำงานอย่างไร "ls -d" แสดงรายการเพียง (ซึ่งแปลก) แต่ทำงาน "ls -d * /"
Yoo

1
มันค่อนข้างยุ่งยาก ... "ls -d" คล้ายกับ "ls -d ./" และ "ls -d /" ถึง "ls -d ./*/" สวิตช์ '-d' set 'ls' tu จะแสดงเฉพาะรายการไดเรกทอรีเท่านั้น แต่หากคุณไม่มีพารามิเตอร์มันจะใช้ไดเรกทอรีปัจจุบันเป็นพารามิเตอร์ดังนั้นมันจึงมีเฉพาะ "." เท่านั้น ไดเรกทอรีไปยังรายการ ...
edomaur

1
ฉันไม่อยากจะเชื่อเลยว่าฉันไม่เคยค้นพบสิ่งนี้มาก่อน สุดยอดเคล็ดลับ
Nick Dixon

ไม่มีคำพูดแค่ว้าว !!! :)
dimba

41

ESC.

แทรกอาร์กิวเมนต์ล่าสุดจากคำสั่ง bash ล่าสุดของคุณ มันมีประโยชน์มากกว่าที่คุณคิด

cp file /to/some/long/path

ซีดี ESC.


มันใช้งานได้สำหรับฉัน (ทุบตี) โปรดทราบว่าคุณกดปุ่ม esc และจากนั้นกดปุ่มระยะเวลา ไม่มีเครื่องหมายขีดคั่นหรืออะไรเลย
Howler

9
นอกจากนี้ alt- เป็นสิ่งเดียวกัน
Mark Baker

ใช่มันทุบตีเท่านั้น แต่ <esc> (หรือ Alt- หรือ Meta-) _ ถูกผูกไว้กับฟังก์ชั่นเดียวกันและ <esc> -_ ก็ทำงานในโหมด vi ด้วยเช่นกัน
Nick Dixon

@hendry ใน zsh ของฉันมันใช้งานได้จริง บางทีคุณอาจใช้โหมด vi
ZyX

ใช้ kbd-tag เพื่อความนิยมของแป้นพิมพ์: <kbd> ESC </kbd> (แต่ไม่เล่นได้ดีมากพร้อมกับการจัดรูปแบบโค้ด / เยื้อง)
ผู้ใช้ไม่ทราบ

36

แน่นอนคุณสามารถ " diff file1.txt file2.txt" แต่ Bash รองรับการทดแทนกระบวนการซึ่งช่วยให้คุณสามารถdiffส่งออกคำสั่ง

ตัวอย่างเช่นสมมติว่าฉันต้องการให้แน่ใจว่าสคริปต์ของฉันให้ผลลัพธ์ที่ฉันต้องการ ฉันสามารถตัดสคริปต์ของฉันใน <() และป้อนมันเพื่อdiffทดสอบหน่วยที่รวดเร็วและสกปรก:

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

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

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

มีตัวอย่างอื่น ๆ ในคู่มือขั้นสูงทุบตีการเขียนสคริปต์ที่มีhttp://tldp.org/LDP/abs/html/process-sub.html


35

คำสั่งที่ฉันชอบคือ "ls -thor"

มันเรียกพลังของเหล่าทวยเทพเพื่อแสดงรายการไฟล์ที่แก้ไขล่าสุดในรูปแบบที่อ่านได้สะดวก


6
ทำให้ผมนึกถึงอีกไร้ประโยชน์โดยสิ้นเชิง ls -bart -simpson -rulsแต่ยังคำสั่งตลก: S, ICNR
filiprem

'ls -tor' ยังมีประโยชน์เนื่องจากคุณสามารถค้นหาไฟล์ขนาดใหญ่ได้อย่างรวดเร็ว และการสะกดคำภาษาสวีเดนต้นฉบับของชื่อเทพเจ้าแห่งฟ้าร้องนั้นจริงๆแล้วคือ 'Tor'
dala

ในภาษาเดนมาร์กคุณสามารถใช้ls -lortซึ่งเป็นคำภาษาเดนมาร์กสำหรับ "อึ" ไม่ใส่กลุ่มใด ๆ และไม่ได้รับการลงโทษของ valhal :)
Jesper Ronn เซ่น

1
เราสามารถพูดได้เช่น "ls -lotr" ซึ่งเห็นได้ชัดว่าเกี่ยวข้องกับโทลคีนและลอร์ดออฟเดอะริงส์ :)
ADEpt

28

เพิ่มเติมของความแปลกใหม่ แต่มันฉลาด ...

คำสั่ง 10 อันดับแรกที่ใช้:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

ตัวอย่างผลลัพธ์:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi

1
นี่คือรุ่นที่สั้นกว่าและเร็วกว่า:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
หยุดชั่วคราวจนกว่าจะมีประกาศ

25

ค้นหาแบบย้อนกลับ ^ R กด ^ R พิมพ์ส่วนของคำสั่งก่อนหน้าที่คุณต้องการจับคู่และกด ^ R จนกว่าคุณจะพบคำสั่งที่คุณต้องการ จากนั้นฉันไม่จำเป็นต้องจำคำสั่งที่ใช้ล่าสุดที่ยังอยู่ในประวัติของฉัน ไม่เฉพาะทุบตี แต่ยัง: ^ E สำหรับจุดสิ้นสุดของบรรทัด, ^ A สำหรับจุดเริ่มต้นของบรรทัด, ^ U และ ^ K เพื่อลบก่อนและหลังเคอร์เซอร์ตามลำดับ


2
ฉันจำไม่ได้ ^ U ด้วยเหตุผลบางอย่าง ไม่มีคำลบทางลัดลบใช่หรือไม่
hoyhoy

1
^ W ลบคำก่อนเคอร์เซอร์ (อย่าลังเลที่จะแก้ไขคำตอบของคุณด้วยสิ่งนี้)
Jon Ericson

2
^ R มีประโยชน์มากจนมันถูกกล่าวถึงในคำถาม :)
มาร์คเบเกอร์

20

ฉันมักจะมีชื่อแทนสำหรับ vi, ls ฯลฯ แต่บางครั้งคุณต้องการที่จะหลบหนีนามแฝง เพียงเพิ่มเครื่องหมายสแลชกลับไปที่คำสั่งด้านหน้า:

เช่น:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

เจ๋งใช่มั้ย


คุณยังสามารถเรียกใช้command- ดูSHELL BUILTIN COMMANDSในคู่มือ Bash
Iceland_jack

17

นี่คือการปรับแต่งค่าบางอย่าง:

~/.inputrc:

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

ใช้งานได้เหมือนกัน^Rแต่ใช้ปุ่มลูกศรแทน ซึ่งหมายความว่าฉันสามารถพิมพ์ (เช่น) cd /media/จากนั้นกดลูกศรขึ้นเพื่อไปยังสิ่งสุดท้ายที่ฉันcdต้องการใน/media/โฟลเดอร์

(ฉันใช้เทอร์มินัล Gnome คุณอาจจำเป็นต้องเปลี่ยนรหัสยกเว้นสำหรับเทอร์มินัลอีมูเลเตอร์อื่น ๆ )

การสำเร็จของ Bash นั้นมีประโยชน์อย่างไม่น่าเชื่อ แต่ก็เป็นการเพิ่มที่ลึกซึ้งยิ่งขึ้น ใน~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

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

ทำงานได้ดีกับสิ่งนี้ใน~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

+1 bash_completion ยอดเยี่ยมมาก
prestomation

บน Mac การค้นหาประวัติด้วยปุ่มลูกศรสามารถเปิดใช้งานด้วย: ผูก '"\ e [A"': ผูกประวัติการค้นหาย้อนหลัง '' \ e [B "': ประวัติการค้นหาไปข้างหน้า
Asmus

17

ฉันใช้สิ่งต่อไปนี้มาก:

:pปรับปรุงการพิมพ์ผลประวัติศาสตร์ เช่น

!!:p

จะพิมพ์คำสั่งสุดท้ายเพื่อให้คุณสามารถตรวจสอบว่ามันถูกต้องก่อนที่จะเรียกใช้อีกครั้ง เพียงแค่ใส่!!เพื่อรัน

ในหลอดเลือดดำที่คล้ายกัน:

!?foo?:p

จะค้นหาประวัติคำสั่งล่าสุดที่มีสตริง 'foo' และพิมพ์

หากคุณไม่จำเป็นต้องพิมพ์

!?foo

ทำการค้นหาและดำเนินการทันที


2
แทนที่จะใช้: p คุณสามารถใช้พื้นที่เวทย์มนตร์: stackoverflow.com/questions/603696/…
Yoo

เพื่อขยายการควบคุมทางประวัติศาสตร์โดยไม่ต้องเรียกใช้ magick-space ที่น่าbind Space:magic-space # !pin<space>
เชื่อถือ

16

ฉันมีอาวุธลับ: เปลือก -fu

มีเคล็ดลับอัจฉริยะพันเคล็ดลับเด็ด ๆ และสูตรอาหารที่มีประสิทธิภาพซึ่งส่วนใหญ่เวลาพอดีกับบรรทัดเดียว

หนึ่งที่ฉันรัก (แต่ฉันโกงนิดหน่อยตั้งแต่ฉันใช้ความจริงที่ว่า Python ติดตั้งในระบบ Unix ส่วนใหญ่แล้ว):

alias webshare='python -m SimpleHTTPServer'

ตอนนี้ทุกครั้งที่คุณพิมพ์ "webshare" ไดเรกทอรีปัจจุบันจะพร้อมใช้งานผ่านพอร์ต 8000 ดีจริง ๆ เมื่อคุณต้องการแชร์ไฟล์กับเพื่อน ๆ ในเครือข่ายท้องถิ่นโดยไม่ใช้คีย์ usb หรือ dir จากระยะไกล การสตรีมวิดีโอและเพลงก็ใช้งานได้เช่นกัน

และแน่นอนว่า fork fork วางระเบิดแบบคลาสสิกที่ไร้ประโยชน์อย่างสมบูรณ์ แต่ก็ยังมีความสนุกมากมาย:

$ :(){ :|:& };:

อย่าลองใช้ในเซิร์ฟเวอร์ที่ใช้งานจริง ...


ฉันเดาว่าฉันไม่ควร webshare /
ยู

ฉันเดาว่าคุณสามารถทำให้คำสั่งนั้นง่ายขึ้นpython -m SimpleHTTPServer(เว้นแต่ฉันจะพลาดสิ่งที่คำสั่งดั้งเดิมไม่ได้ทำ
Jesper Rønn-Jensen

Meh บนเซิร์ฟเวอร์ที่ใช้งานจริงซึ่ง fork bomb จะเพิ่งถูกโจมตีโดยระบบปฏิบัติการ มีข้อ จำกัด เกี่ยวกับจำนวนกระบวนการที่ผู้ใช้สามารถสร้างได้
Donal Fellows

3
@ Donal: คุณควรลองและรายงานสิ่งที่คุณค้นพบ
Michael Foukarakis

12

คุณสามารถใช้คำสั่ง watch ร่วมกับคำสั่งอื่นเพื่อค้นหาการเปลี่ยนแปลง ตัวอย่างนี้คือเมื่อฉันทดสอบเราเตอร์ของฉันและฉันต้องการรับหมายเลขล่าสุดเกี่ยวกับสิ่งต่าง ๆ เช่นอัตราส่วนสัญญาณต่อสัญญาณรบกวน ฯลฯ

watch --interval=10 lynx -dump http://dslrouter/stats.html

คำสั่ง watch นั้นยอดเยี่ยมจริงๆ ฉันอ่านครั้งแรกในหนังสือ Linux Server Hacks เมื่อประมาณห้าปีที่แล้ว ใครจะรู้ว่ามันมีอยู่จริง?
hoyhoy

11
'การเฝ้าดู' ในโลกนี้เกี่ยวข้องกับการทุบตีอะไรบ้าง?
Artem Russakovskii

11
type -a PROG

เพื่อค้นหาสถานที่ทั้งหมดที่มี PROG โดยปกติแล้วจะอยู่ใน ~ / bin แทนที่จะเป็นหนึ่งใน / usr / bin / PROG ที่อาจคาดหวัง


1
นอกจากนี้ยังจะบอกคุณว่าเป็นฟังก์ชั่นหรือนามแฝง หากอยู่ในหลาย ๆ สถานที่ของคุณPATHมันจะแสดงแต่ละแห่ง
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

11

ฉันต้องการสร้างคำสั่งด้วยเสียงก้องและท่อพวกเขาไปยังเปลือก:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

ทำไม? เพราะมันทำให้ฉันดูสิ่งที่จะต้องทำก่อนที่ฉันจะทำ ด้วยวิธีนี้ถ้าฉันมีข้อผิดพลาดที่น่ากลัว (เช่นลบไดเรกทอรีบ้านของฉัน) ฉันสามารถจับมันก่อนที่มันจะเกิดขึ้น เห็นได้ชัดว่านี่เป็นสิ่งสำคัญที่สุดสำหรับการกระทำที่เป็นการทำลายหรือเพิกถอนไม่ได้


1
คุณอาจต้องการใช้ find -print0 และ xargs -0 เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับไฟล์และโฟลเดอร์ที่มีช่องว่างสีขาว
neu242

หรือหลีกเลี่ยงการสร้างและทำงานกับไฟล์และโฟลเดอร์ที่มีช่องว่างสีขาวในชื่อ ;-) เห็นได้ชัดว่าถ้าคุณทำงานกับชื่อที่ผู้ใช้สร้างขึ้นข้อเสนอแนะของคุณมีความสำคัญ
Jon Ericson

4
ทำไมคุณต้องผนวก "| ksh -s" เมื่อคุณสามารถลบ "echo" ได้?
Yoo

ไม่จำเป็นต้องไปป์กับ GNU ค้นหา:$ find dir -name \\*~ -exec rm {} +
bobbogo

10

เมื่อดาวน์โหลดไฟล์ขนาดใหญ่ฉันมักจะทำ:

while ls -la <filename>; do sleep 5; done

จากนั้นก็แค่ ctrl + c เมื่อฉันทำเสร็จ (หรือถ้าlsส่งกลับไม่ใช่ศูนย์) มันคล้ายกับwatchโปรแกรม แต่ใช้เชลล์แทนดังนั้นจึงทำงานบนแพลตฟอร์มที่ไม่มีwatchแต่จะใช้เปลือกหอยแทนจึงทำงานบนแพลตฟอร์มโดยไม่ต้อง

อีกเครื่องมือที่มีประโยชน์คือ netcat ncหรือ ถ้าคุณทำ:

nc -l -p 9100 > printjob.prn

จากนั้นคุณสามารถตั้งค่าเครื่องพิมพ์บนคอมพิวเตอร์เครื่องอื่น แต่ใช้ที่อยู่ IP ของคอมพิวเตอร์ที่ใช้ netcat แทน เมื่องานพิมพ์จะถูกส่งไปก็จะได้รับจากการทำงาน netcat printjob.prnคอมพิวเตอร์และทิ้งลงใน


ทำไมนี้และไม่ยกตัวอย่างเช่นwget?
porges

ลองwatch ls -la <filename>(ใช้ -n5 หากคุณไม่ชอบค่าเริ่มต้น 2 วินาที)
Ted Percival

1
@Ted watchไม่สามารถใช้ได้กับทุกแพลตฟอร์ม แต่เช่น Solaris, Mac OS X, ฯลฯ @Porges ไม่แน่ใจว่าคุณหมายถึงอะไร สามารถฟังบนพอร์ตได้หรือไม่
dreamlax


10

วิธีการนำทางหนึ่งที่ต้องการเมื่อฉันใช้หลายไดเรกทอรีในสถานที่แยกกันอย่างแพร่หลายในลำดับชั้นต้นไม้คือการใช้ acf_func.sh (รายการด้านล่าง) เมื่อกำหนดแล้วคุณสามารถทำได้

ซีดี -

เพื่อดูรายการไดเรกทอรีล่าสุดพร้อมเมนูตัวเลข

cd -2

เพื่อไปยังไดเรกทอรีล่าสุดที่สอง

ใช้งานง่ายมากมีประโยชน์มาก

นี่คือรหัส:

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

10

ขยายบรรทัดที่ซับซ้อนก่อนกดปุ่ม Enter ที่หวั่น

  • Alt+ Ctrl+ e- เปลือกขยายสาย (อาจต้องใช้Esc, Ctrl+ eบนแป้นพิมพ์ของคุณ)
  • Ctrl+ _- เลิกทำ
  • Ctrl+ x, *- glob-expand-word

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

&ค.


+1, ฉันกลัวการกดEnter:)
João Portela

ไม่ทราบสิ่งเหล่านี้ เลิกทำเป็นนักฆ่า ดีสำหรับการแก้ไขบรรทัดคำสั่งใด ๆ
Philippe A.

9

ฉันเป็นบางส่วนเสมอไปที่:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

ฉันยังใช้shopt -s cdable_varsแล้วคุณสามารถสร้างตัวแปรทุบตีไปยังไดเรกทอรีทั่วไป ดังนั้นสำหรับที่มาของ บริษัท ฉันสร้างตัวแปรหลายอย่างเช่น:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

จากนั้นฉันสามารถเปลี่ยนเป็นไดเรกทอรีcd Dcentmainนั้นได้


Home และ End ทำสิ่งเดียวกันกับ crtl-A และ ctrl-E
davidfg4

สิ่งนี้จะช่วยในแล็ปท็อป Mac ที่ไม่มีปุ่มโฮมและปุ่มวางสาย
jamesh

แต่น่าเสียดายที่ Ctrl-A ยังเป็นกุญแจสำคัญในการหลบหนีสำหรับscreenเป็นค่าเริ่มต้น ฉันทำการแมปใหม่ไปยัง ctrl-X ในตัวฉัน.screenrcแต่แล้วฉันไม่ใช่ผู้ใช้ emacs
ระบบหยุดชั่วคราว

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

1
เพิ่มเติมสำหรับรายการทางลัดของคุณ: CTRL + K เพื่อลบทุกอย่างจากเคอร์เซอร์ไปที่ท้ายบรรทัด CTRL + U เพื่อลบทุกอย่างก่อนเคอร์เซอร์ ALT + F / ALT + B เพื่อย้ายหนึ่งคำไปข้างหน้า / ข้างหลัง (หรือ CTRL + ลูกศรซ้าย / CTRL + ลูกศรขวา) +1 สำหรับ cdable_vars!
Philippe A.

8

pbcopy

สำเนานี้ไปยังคลิปบอร์ดของระบบ Mac คุณสามารถไพพ์คำสั่งได้ ... ลอง:

pwd | pbcopy


NB! นี่เป็นคำสั่งเฉพาะของ Mac
dala

นี่ไม่ใช่: alias pbcopy='xsel --clipboard --input' และ alias pbpaste='xsel --clipboard --output'
wawawawa

7
$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done

ใช้history 10แทนhistory | tail -10(ซึ่งควรเป็นไปtail -n 10ตามวิธีเนื่องจากไวยากรณ์นั้นเลิกใช้แล้ว)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

7

การใช้ 'set -o vi' จากบรรทัดคำสั่งหรือดีกว่าใน. bashrc ทำให้คุณอยู่ในโหมดแก้ไข vi บนบรรทัดคำสั่ง คุณเริ่มต้นในโหมด 'แทรก' เพื่อให้คุณสามารถพิมพ์และถอยกลับได้ตามปกติ แต่ถ้าคุณทำผิดพลาด 'ใหญ่' คุณสามารถกดปุ่ม esc แล้วใช้ 'b' และ 'f' เพื่อเลื่อนไปตามที่คุณทำใน vi cw เพื่อเปลี่ยนคำ มีประโยชน์อย่างยิ่งหลังจากที่คุณเรียกใช้คำสั่งประวัติที่คุณต้องการเปลี่ยน


7

รายการโปรดปัจจุบันของฉันคือการกดแป้นพิมพ์ [alt] (Alt และ "." คีย์ร่วมกัน) นี่เหมือนกับ $! (แทรกอาร์กิวเมนต์ล่าสุดจากคำสั่งก่อนหน้า) ยกเว้นว่าจะเป็นแบบทันทีและพิมพ์ได้ง่ายขึ้น (ไม่สามารถใช้ในสคริปต์ได้)

เช่น:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

ลองรวมกับ Alt- [0-9] (กดชุดแรกแล้วปล่อยจากนั้นกดสอง) เช่นถ้าคำสั่งสุดท้ายคือ 'mv foo bar' ดังนั้น "Alt-0 Alt-." ให้ 'mv', "Alt-1 Alt-." ให้ 'foo', "Alt-2 Alt-." และ Alt- พื้นฐาน ทั้งให้ 'บาร์' ฯลฯ
Sam Stokes

1
ลองกด Alt- ด้วย มากกว่าหนึ่งครั้ง (หรือกด Alt ค้างไว้ที่นั่นกดจุดหลายครั้งแล้วปล่อย Alt) ซึ่งคล้ายกับการกด Ctrl-R มากกว่าหนึ่งครั้ง
Yoo

7

สตริงคำสั่งหลายคำพร้อมกันโดยใช้&&คำสั่ง :

./run.sh && tail -f log.txt

หรือ

kill -9 1111 && ./start.sh

1
หากล้มเหลวคำสั่งอื่น ๆ ที่เคยถูกดำเนินการ (ล้มเหลวอย่างรวดเร็วเหมือนใน Programmation)
เฟรเดริก Morin

1
ตรงกันข้ามคือการใช้ตรรกะหรือ '||' ที่ด้านขวามือจะถูกประหารชีวิตถ้าด้านซ้ายมือเป็นเท็จเท่านั้น ตัวอย่าง: <code> command_1 || command_2 </ code>
Dala
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.