ตัวอย่างเช่นถ้าฉันทำ
mkdir thisismyfolder912
ฉันจำได้ว่ามีวิธีที่ง่ายกว่าในการสลับไปใช้thisismyfolder912
มากกว่าทำ
cd thisismyfolder912
มันคืออะไรและมันทำงานอย่างไร นอกจากนี้วิธีอื่น ๆ ที่ฉันสามารถใช้คืออะไร
ตัวอย่างเช่นถ้าฉันทำ
mkdir thisismyfolder912
ฉันจำได้ว่ามีวิธีที่ง่ายกว่าในการสลับไปใช้thisismyfolder912
มากกว่าทำ
cd thisismyfolder912
มันคืออะไรและมันทำงานอย่างไร นอกจากนี้วิธีอื่น ๆ ที่ฉันสามารถใช้คืออะไร
คำตอบ:
คุณกำลังพูดถึงการขยายประวัติคลาสสิกหรือการประมวลผล Readline หรือไม่? cd !$
บนบรรทัดอินพุตถัดไปจะแทนที่ในอาร์กิวเมนต์สุดท้ายของบรรทัดก่อนหน้าหรือM-.หรือM-_จะดึงมันโดยใช้ Readline
cd !$
ผมกำลังมองหา "การขยายตัวของประวัติศาสตร์คลาสสิกหรือการประมวลผล Readline" ผมไม่เข้าใจว่าสิ่งที่คุณหมายถึง ...
!$
เป็นขยายตัวประวัติศาสตร์ ; เชลล์ประมวลผลขณะที่วิเคราะห์คำสั่งของคุณ M- เป็นการกดแป้นพิมพ์ readline; readline เป็นไลบรารีที่จัดการแต่ละคีย์ที่คุณกดและจะเห็นว่าคุณกด M- และพิมพ์อาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายให้คุณโดยอัตโนมัติ
หากคำถามของคุณเกี่ยวกับการเข้าถึงประวัติคำสั่งให้ลองใช้คำสั่งที่มีชื่อเสียง
history
นอกจากนี้คุณยังสามารถลองCtrl+ rและเริ่มพิมพ์คำสั่งที่คุณพยายามจำได้ว่าคุณเพิ่งพิมพ์
(reverse-i-search)`cd ': cd mydir/data/
กดESCเพื่อเลือกคำสั่งหรือออก สิ่งนี้ใช้ได้กับ SuSE เป็นอย่างน้อย ไม่แน่ใจเกี่ยวกับสิ่งรบกวนอื่น ๆ
history | grep ...
!
vi
เพื่อจัดการบรรทัดคำสั่งของคุณ ดูเท่ห์สุด ๆ โดยใช้คำสั่ง vi เปลือกแก้ไข
มันง่ายเหมือนAlt+.
$ mkdir lasdfjalsdkjf
$ cd
Alt + .
$ cd lasdfjalsdkjf
<kbd></kbd>
แท็กเพื่อล้อมรอบคีย์
<kbd>
สิ่งนี้ใช้ได้กับฉันเสมอ:
mkdir thisismyfolder
cd $_
$!
ขยายไปยังคำสุดท้ายที่คุณพิมพ์จริง$_
ขยายไปยังคำสุดท้ายหลังจากการขยาย - ดังนั้นคุณอาจecho /tmp/tmpfile*
และเห็นกลุ่มของไฟล์ที่คุณต้องการลบ แต่จากนั้นrm $_
จะลบหนึ่งในนั้น
หยิบทิปจากกระทู้อื่นถ้าคุณใส่:
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
ใน. bashrc ของคุณจากนั้นคุณสามารถเริ่มพิมพ์บางอย่างจากประวัติของคุณจากนั้นกดลูกศรขึ้นจากนั้นแทนที่จะข้ามผ่านรายการประวัติของคุณตามรายการมันจะข้ามไปทางขวาไปยังรายการก่อนหน้าซึ่งเริ่มต้นด้วยสิ่งที่คุณมีอยู่แล้ว พิมพ์
ฉันเดาว่านี่จะไม่ช่วยอะไรมากกับตัวอย่างเฉพาะที่ให้ไว้ในคำถาม แต่มันเป็นสิ่งหนึ่งที่ช่วยให้ฉันเข้าถึงประวัติได้อย่างรวดเร็ว
ถ้าคุณใช้ทุบตีฉันขอแนะนำและ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:~$
$
เป็นเพียงแค่มีประโยชน์เมื่อสาธิตpushd
ฯลฯ )
ในบันทึกที่เกี่ยวข้องฉันแนะนำให้ใช้ 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
หากเชลล์ของคุณใช้ readline (ซึ่งเป็นกรณีของbash
) คุณสามารถทำสิ่งที่ต้องการกดATL+ .ร่วมกัน?
จากเอกสาร GNU Readline :
yank-last-arg (M-. หรือ M-_)
แทรกอาร์กิวเมนต์ล่าสุดลงในคำสั่งก่อนหน้า (คำสุดท้ายของรายการประวัติก่อนหน้า) ด้วยการโต้แย้งทำตัวเหมือน yank-nth-arg การโทรที่ต่อเนื่องไปยัง yank-last-arg ย้ายกลับไปที่รายการประวัติโดยแทรกอาร์กิวเมนต์สุดท้ายของแต่ละบรรทัด
cd this<TAB>