สามารถ ',,' สามารถใช้นามแฝงเป็น '.. ' ได้หรือไม่


41

บางครั้งเมื่อฉันต้องการที่จะเปลี่ยนแปลงไปยังไดเรกทอรีแม่ผมเข้าใจผิดพิมพ์แทนcd ,, cd ..มีวิธีที่ฉันสามารถทุบตีพิจารณางบเหล่านี้จะเหมือนกันหรือไม่ ฉันไม่เคยใช้เครื่องหมายจุลภาคในคำสั่งของฉัน จะเป็นการดีที่ผมอยากจะนามแฝงไป,, ..เมื่อฉันลองสิ่งนี้มันไม่ทำงาน ทำไมมันไม่ทำงาน ฉันจะแก้ไขปัญหานี้ได้อย่างไร

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
นามแฝงเป็นโปรแกรมที่จะเรียกใช้ไม่ใช่อาร์กิวเมนต์สำหรับโปรแกรม ดังนั้นจะบ่นเป็นเช่น:$ ,, bash: ..: Is a directory(ในคำอื่น ๆ ก็ไม่ได้ปฏิบัติการ.)
jpaugh

5
@jpaugh: วิธีที่ชัดเจนกว่าในการกล่าวคือ: alias ส่วนขยายจะเกิดขึ้นกับ "word" แรกของคำสั่งเท่านั้น ดังที่คุณพูดมันใช้ได้กับชื่อคำสั่งเท่านั้นไม่ใช่ args (และคุณอาจไม่ได้alias 'cd ,,'='cd ..'. ดีคุณจะทำได้ แต่คุณจะต้องเรียกใช้เป็นcd\ ,,เพื่อให้ทุกคำเดียว.)
ปีเตอร์ Cordes

5
พิจารณา zsh มันมีนามแฝงระดับโลกดังนั้นalias -g ,,=..และcd ,,ทำงานตามที่คุณคาดหวัง
muru

1
ความคิดด้านข้าง: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
Imho: อย่าทำอย่างนี้ การใช้นามแฝงเพื่อปกปิดข้อผิดพลาดในการพิมพ์คือการปฏิบัติที่ไม่ดี ข้อผิดพลาดเหล่านั้นสามารถจบลงในรหัสที่คัดลอกหรือ screencasts มันจะไม่ทำงานในโฮสต์หรือบัญชีอื่น ๆ และการดัดแปลงดังกล่าว (ขึ้นอยู่กับวิธีการนำไปใช้) อาจทำให้เกิดข้อผิดพลาดอื่น ๆ ที่ไม่คาดคิดและยากต่อการดีบัก คำแนะนำของฉัน: หากคุณพิมพ์คำสั่งผิดให้พิมพ์อีกครั้ง ;-)
jjmontes

คำตอบ:


45

ZSH:

หาก you'r ใช้zsh alias -g ,,=".."คือสิ่งที่คุณต้องการ แต่นี้จะทำให้เกิด ",," ที่จะขยายตัวได้ทุกที่ไม่เพียง cdแต่เมื่อใช้กับ

จากman zshbuiltins:

หากมีการ -g ตั้งค่าสถานะกำหนดนามแฝงส่วนกลาง นามแฝงส่วนกลางจะถูกขยายแม้ว่าจะไม่เกิดขึ้นในตำแหน่งคำสั่ง

ทุบตี:

หากถูก จำกัด ไว้ที่bash(เนื่องจากคำถามถูกแท็กด้วย ) อ่านต่อไปนี้:

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

ข้อความman bash:

หากอักขระตัวสุดท้ายของค่านามแฝงเป็นค่าว่างคำว่าคำสั่งถัดไปถัดจากนามแฝงจะถูกตรวจสอบด้วยว่ามีการขยายสมนามหรือไม่

ดังนั้นมันพอที่จะนามแฝงcdที่มีพื้นที่พิเศษ (เพื่อช่วยให้การขยายตัวของการโต้แย้งต่อไปของมัน) แล้วนามแฝงไป,, ..เห็นไหมว่า

alias cd='cd '
alias ,,='..'

ให้สิ่งที่คุณต้องการ

โปรดทราบว่าสิ่งนี้ถูกต้องไม่เพียง แต่สำหรับbash(และaliasการนำไปใช้) แต่เชลล์ที่ทำงานร่วมกันได้กับ POSIX ทั้งหมด ยกตัวอย่างจากman 1p alias(คู่มือไม่ได้อธิบายคุณสมบัตินี้อย่างชัดเจนผ่านตัวอย่าง):

  1. ตั้งค่า nohup เพื่อให้สามารถจัดการกับอาร์กิวเมนต์ที่เป็นชื่อนามแฝง:

           alias nohup="nohup "

คำเตือน: ในฐานะที่เขียน @PeterCordes ในความคิดเห็นของเขาโดยอัตโนมัติจะสาเหตุอื่น ๆcdนามแฝงว่าจะขยายตัวเมื่อเขียนขึ้นหลังจากที่ มันอาจทำให้คุณต้องเขียนcd \grepถ้าคุณต้องการที่จะเปลี่ยนไดเรกทอรีให้เป็นหนึ่งในชื่อgrepของคุณ แต่เป็นนามแฝงสำหรับgrep grep --color=autoหากไม่มีแบ็กสแลชcdจะรายงานข้อผิดพลาด "มีอาร์กิวเมนต์มากเกินไป" (คุณไม่สามารถcdไดเรกทอรีสองไดเรกทอรีพร้อมกันได้)!


22
นั่นเป็นการแฮ็คที่ฉลาด แต่น่ารังเกียจ ฉันไม่อยากทำอย่างนั้น ง่ายเกินไปที่จะกัดคุณโดยไม่ตั้งใจ เช่นถ้าคุณมีนามแฝงสำหรับคำสั่งที่คุณมักเรียกใช้และคุณต้องการcdเข้าไปในไดเรกทอรีของซอร์สโค้ด หรือการชนอื่น ๆ ระหว่างชื่อแทนของคุณและชื่อไดเรกทอรีทั่วไป เหมือนcd drจะขยายตัวออกไปcd disown -rสำหรับฉันกับนามแฝงนี้ อย่างไรก็ตามดีกว่ามากที่จะแทนที่ builtin cdด้วยฟังก์ชั่นสำหรับสิ่งนี้ IMO
Peter Cordes

8
+1 สำหรับวิธีแก้ปัญหานามแฝงแท้ (ฉันเรียนรู้บางสิ่ง) ในเวลาเดียวกันฉันเห็นด้วยกับความคิดเห็นของปีเตอร์ ฉันคิดว่าคำเตือนที่ชัดเจนบางอย่างควรถูกเพิ่มเข้าไปในคำตอบของคุณ
Kamil Maciorowski

58

นามแฝงไม่ได้หมายถึงทำแบบนี้ แต่คุณสามารถสร้างฟังก์ชั่นที่เรียกว่าที่เป็นเสื้อคลุมสำหรับจริงcd cdอันนี้ใช้ได้สำหรับฉัน! เพียงแค่ใส่ลงใน.bash_profileไฟล์ที่คุณเลือก

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

หรือด้วยความคิดเห็นและการจัดรูปแบบที่สวยงาม:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

แก้ไข

ขอบคุณสำหรับ derobert @ ชี้ให้เห็นว่าจะดีกว่าที่นี่กว่าif then else && ||นอกจากนี้ฉันเพิ่งรู้ ( * facepalm *) ว่าการใช้งานนี้จะใช้ได้เฉพาะในกรณีที่ข้อโต้แย้งที่ไม่ใช่เส้นทาง (เช่น-L -P) ไม่ใช่อาร์กิวเมนต์แรก ดังนั้นจะเตือนถ้าคุณมีนิสัยที่ไม่ดีของพิมพ์cd -L ,,นี้ไม่ได้จะช่วยให้คุณ และนั่นก็ไม่ใช่เรื่องง่ายที่จะจัดการอย่างถูกต้องฉันคิดว่า


16
@BenjiWiebe ฉันคิดว่าเวอร์ชั่น "ความคิดเห็นและการจัดรูปแบบสวย ๆ " น่าจะดีกว่าถ้าใช้แบบอื่น
zwol

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

1
หรือเพียงแค่เขียนทับ$1ก่อนเรียกใช้งานบิวด์อิน:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}"หรือคุณสูญเสียสิ่งใดหลังจากการโต้แย้งครั้งแรก
chepner

8
ในทางเทคนิค..แล้วไม่จำเป็นต้องเป็นข้อโต้แย้งแรก cdในbashสามารถใช้ความหลากหลายของตัวเลือก ( -P, -L, -@, -e)
chepner

29

นามแฝงจะต้องเป็นคำแรกของคำสั่ง นอกจากนี้ชื่อแทนจะต้องถูกแทนที่ด้วยคำดังนั้นจึงไม่มีช่องว่าง)

คู่มืออ้างอิง Bash: นามแฝง

นามแฝงอนุญาตให้ใช้สตริงแทนคำได้เมื่อใช้เป็นคำแรกของคำสั่งแบบง่าย

คุณสามารถนามแฝงทั้งสอง..และจะเป็น,,cd ..

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

นั่นคือสิ่งที่ฉันทำ! : D สองจุด / เครื่องหมายจุลภาคพิมพ์ได้ง่ายกว่าcd ..
rav_kr

10
+1 นั่นไม่ใช่ความคิดที่ดีเลย อีกวิธีในการทำ.. ใน Bash คือการshopt -s autocdให้คุณเปลี่ยนไปยังไดเรกทอรีใด ๆ โดยเพียงแค่ใส่ชื่อ แน่นอนคุณยังเป็นนามแฝงสำหรับ,,
ilkkachu


3

อีกวิธีใน..การเปลี่ยนแปลงไดเรกทอรีคือการเปิดใช้งานautocd คุณสมบัติของ Bash :

shopt -s autocd 

ซึ่งจะเปลี่ยนไดเรกทอรีโดยอัตโนมัติเมื่อคุณป้อนชื่อ:

~$ /tmp
cd /tmp
/tmp$ 

คุณยังคงต้องสร้างนามแฝงสำหรับ,,แต่นั่นสามารถทำได้ด้วยเพียงแค่alias ,,=..


2

มีสคริปต์สำหรับแอปนั้นแล้ว: https://github.com/shyiko/commacd (ไม่มีการติดต่อกับ Stanley Shuyiko)

commacdส่งออกสามคำสั่ง: ,(สำหรับการกระโดดไปข้างหน้า), ,,(ข้างหลัง) และ,,,(ข้างหลัง + ไปข้างหน้า):

ทั้งสามพยายามจับคู่กันตามคำนำหน้าก่อน เฉพาะในกรณีที่ไม่พบผลลัพธ์จะจับคู่กับสตริงย่อย (ฟัสซี)

ในการตอบคำถามของคุณนามแฝงของสคริปต์จะใช้คอมม่าสามฟังก์ชันที่กำหนดไว้:

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