วิธีการเข้าถึงประวัติทันทีใน Unix?


12

ตัวอย่างเช่นถ้าฉันทำ

mkdir thisismyfolder912

ฉันจำได้ว่ามีวิธีที่ง่ายกว่าในการสลับไปใช้thisismyfolder912มากกว่าทำ

cd thisismyfolder912

มันคืออะไรและมันทำงานอย่างไร นอกจากนี้วิธีอื่น ๆ ที่ฉันสามารถใช้คืออะไร


1
ใช้ TAB-completion สำหรับคำสั่งและไดเรกทอรีที่ไม่ได้อยู่ในรายการประวัติล่าสุดของคุณ cd this<TAB>
กลับรายการ

คำตอบ:


10

คุณกำลังพูดถึงการขยายประวัติคลาสสิกหรือการประมวลผล Readline หรือไม่? cd !$บนบรรทัดอินพุตถัดไปจะแทนที่ในอาร์กิวเมนต์สุดท้ายของบรรทัดก่อนหน้าหรือM-.หรือM-_จะดึงมันโดยใช้ Readline


1
โพสต์คำถามอื่นที่กล่าวถึง Alt +
Michael Mrozek

cd !$ผมกำลังมองหา "การขยายตัวของประวัติศาสตร์คลาสสิกหรือการประมวลผล Readline" ผมไม่เข้าใจว่าสิ่งที่คุณหมายถึง ...
Lazer

2
@Lazer !$เป็นขยายตัวประวัติศาสตร์ ; เชลล์ประมวลผลขณะที่วิเคราะห์คำสั่งของคุณ M- เป็นการกดแป้นพิมพ์ readline; readline เป็นไลบรารีที่จัดการแต่ละคีย์ที่คุณกดและจะเห็นว่าคุณกด M- และพิมพ์อาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายให้คุณโดยอัตโนมัติ
Michael Mrozek

9

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

history 

นอกจากนี้คุณยังสามารถลองCtrl+ rและเริ่มพิมพ์คำสั่งที่คุณพยายามจำได้ว่าคุณเพิ่งพิมพ์

(reverse-i-search)`cd ': cd mydir/data/

กดESCเพื่อเลือกคำสั่งหรือออก สิ่งนี้ใช้ได้กับ SuSE เป็นอย่างน้อย ไม่แน่ใจเกี่ยวกับสิ่งรบกวนอื่น ๆ


4
โว้ว! นี้จะจริงจะเปลี่ยนชีวิตของฉัน สกรูคุณhistory | grep ...!
Oli

นี้ไม่ได้เป็นเพียง SuSE ที่เกี่ยวข้องกับฉันคิดว่ามันเป็นคุณลักษณะทุบตี :)
sakisk

ฉันเพิ่งอ่านเกี่ยวกับการใช้viเพื่อจัดการบรรทัดคำสั่งของคุณ ดูเท่ห์สุด ๆ โดยใช้คำสั่ง vi เปลือกแก้ไข
Banjer

7

มันง่ายเหมือนAlt+.

$ mkdir lasdfjalsdkjf
$ cd 

Alt + .

$ cd lasdfjalsdkjf

คุณได้กล่องแฟนซีรอบ ๆ Alt ได้อย่างไร ฉันไม่เห็นมันในคู่มือช่วยเหลือ
Banjer

2
@Banjer: ใช้<kbd></kbd>แท็กเพื่อล้อมรอบคีย์
Lazer


นอกจากนี้ยังเป็นเช่นเดียวกับคำตอบของ jmb
Michael Mrozek

2

สิ่งนี้ใช้ได้กับฉันเสมอ:

mkdir thisismyfolder
cd $_

ระวังแม้ว่านี้: $!ขยายไปยังคำสุดท้ายที่คุณพิมพ์จริง$_ขยายไปยังคำสุดท้ายหลังจากการขยาย - ดังนั้นคุณอาจecho /tmp/tmpfile*และเห็นกลุ่มของไฟล์ที่คุณต้องการลบ แต่จากนั้นrm $_จะลบหนึ่งในนั้น
jmb

1

หยิบทิปจากกระทู้อื่นถ้าคุณใส่:

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

ใน. bashrc ของคุณจากนั้นคุณสามารถเริ่มพิมพ์บางอย่างจากประวัติของคุณจากนั้นกดลูกศรขึ้นจากนั้นแทนที่จะข้ามผ่านรายการประวัติของคุณตามรายการมันจะข้ามไปทางขวาไปยังรายการก่อนหน้าซึ่งเริ่มต้นด้วยสิ่งที่คุณมีอยู่แล้ว พิมพ์

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


1

ถ้าคุณใช้ทุบตีฉันขอแนะนำและpushd popdคุณสามารถสร้างสแต็คของไดเรกทอรีและเรียกดูได้อย่างรวดเร็ว ดูตัวอย่างนี้:

PWD:~$ pushd /opt/google/chrome/resources/
/opt/google/chrome/resources ~
PWD:/opt/google/chrome/resources$ pushd /etc/cron.daily/
/etc/cron.daily /opt/google/chrome/resources ~
PWD:/etc/cron.daily$ pushd /opt/pac/lib/method/
/opt/pac/lib/method /etc/cron.daily /opt/google/chrome/resources ~
PWD:/opt/pac/lib/method$ popd
/etc/cron.daily /opt/google/chrome/resources ~
PWD:/etc/cron.daily$ popd
/opt/google/chrome/resources ~
PWD:/opt/google/chrome/resources$ popd
~
PWD:~$

หากคุณใช้พรอมต์คำย่อทำให้โพสต์อ่านได้ง่ายขึ้น (ฉันหมายถึงการลบผู้ใช้และชื่อโฮสต์ฉันเข้าใจว่าการแสดง PWD แทนที่จะ$เป็นเพียงแค่มีประโยชน์เมื่อสาธิตpushdฯลฯ )
หยุดชั่วคราวจนกว่าจะมีการแจ้งเตือนเพิ่มเติม

1

ในบันทึกที่เกี่ยวข้องฉันแนะนำให้ใช้ histverify ในทุบตี ใส่สิ่งนี้ใน ~ / .bashrc ของคุณ:

shopt -s histverify

สิ่งนี้จะทำให้ bash พิมพ์คำสั่งหลังจากขยาย! $ หรือฟังก์ชันประวัติอื่น ๆ และให้โอกาสคุณดูก่อนที่จะกด Enter อีกครั้งเพื่อเรียกใช้งานจริง สำหรับฉันแล้วการตรวจสุขภาพจิตนั้นคุ้มค่ากับการกดปุ่มพิเศษเป็นครั้งคราว ต้องการให้แน่ใจว่าฉันใช้cd fooคำสั่งไม่ใช่คำสั่งrm -rf foo...

ฉันมักจะใช้Ctrl-Rวิธีการเช่นเดียวกับAlt-.(ซึ่งเป็นแบบที่ดีสำหรับสถานการณ์ที่คุณอธิบาย) ฉันจะใช้!

เหล่านี้เป็นเทคนิคที่มีประโยชน์มากวัตถุประสงค์ทั่วไป

แต่เพื่อตอบคำถามเฉพาะของคุณ:

การสร้างไดเร็กตอรี่และ cd'ing โดยตรงนั้นเป็นชุดค่าผสมทั่วไปที่มีประโยชน์ที่จะมีฟังก์ชั่นในการตัดคำ

function mcd {
  local newdir='_mcd_command_failed_'
  if [ -d "$1" ]; then   # Dir exists, mention that
    echo "$1 exists..."
    newdir="$1"
  else
    if [ -n "$2" ]; then   # We've specified a mode
        command mkdir -p -m $2 "$1" && newdir = "$1"
    else                   # Plain old mkdir
        command mkdir -p "$1" && newdir="$1"
    fi
  fi
  builtin cd "$newdir"   # No matter what, cd into it
}

การใช้งาน: mcd thisismyfolder


1

หากเชลล์ของคุณใช้ readline (ซึ่งเป็นกรณีของbash) คุณสามารถทำสิ่งที่ต้องการกดATL+ .ร่วมกัน?

จากเอกสาร GNU Readline :

yank-last-arg (M-. หรือ M-_)

แทรกอาร์กิวเมนต์ล่าสุดลงในคำสั่งก่อนหน้า (คำสุดท้ายของรายการประวัติก่อนหน้า) ด้วยการโต้แย้งทำตัวเหมือน yank-nth-arg การโทรที่ต่อเนื่องไปยัง yank-last-arg ย้ายกลับไปที่รายการประวัติโดยแทรกอาร์กิวเมนต์สุดท้ายของแต่ละบรรทัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.