จะสร้าง "นามแฝง" สำหรับเส้นทางที่ยาวได้อย่างไร?


95

ฉันพยายามสร้าง "นามแฝง" สำหรับเส้นทางที่ฉันใช้บ่อยในขณะที่ใช้เชลล์สคริปต์ ฉันลองทำบางอย่างแล้ว แต่ล้มเหลว:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

ฉันจะทำให้มันทำงานได้อย่างไร?
อย่างไรก็ตามการcd ~/Files/Scripts/Mainทำงาน

คำตอบ:


121

เนื่องจากเป็นตัวแปรสภาพแวดล้อม (นามแฝงมีคำจำกัดความที่แตกต่างกันbash) คุณจึงต้องประเมินด้วยสิ่งต่อไปนี้

cd "${myFold}"

หรือ:

cp "${myFold}/someFile" /somewhere/else

แต่จริงๆแล้วฉันคิดว่ามันง่ายกว่าถ้าคุณแค่ต้องการความสะดวกในการเปลี่ยนเป็นไดเรกทอรีนั้นเพื่อสร้างนามแฝงจริง (ในbashไฟล์เริ่มต้นระบบใดไฟล์หนึ่งเช่น.bashrc) ดังนั้นฉันจึงสามารถบันทึกการกดแป้นได้:

alias myfold='cd ~/Files/Scripts/Main'

จากนั้นคุณสามารถใช้ (โดยไม่มีcd):

myfold

เพื่อกำจัดคำจำกัดความคุณใช้unalias. การถอดเสียงต่อไปนี้แสดงการดำเนินการทั้งหมดนี้:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

ขอบคุณ. ที่ได้ผล ฉันลองใช้นามแฝง myfold = '~ / some / path' และ cd myfold เท่านั้น ฉันได้รับข้อผิดพลาด - ไม่มีไดเรกทอรีดังกล่าว ทำไม? นอกจากนี้ยัง "ยกเลิกการกำหนด" ตัวแปรนามแฝงได้หรือไม่
bashboy

myfold = '~ / some / path' cd "$ myfold" ล้มเหลว ทำไม?
bashboy

1
@bashboy อาจเป็นเพราะคุณไม่มีไดเร็กทอรีที่มีชื่อนั้น ~ / some / path เป็นตัวอย่างคุณควรแทนที่เส้นทางจริงที่คุณต้องการใช้ ฉันจะเปลี่ยนไปใช้ไดเรกทอรีตัวอย่างของคุณเพื่อให้ชัดเจนขึ้น ในการยกเลิกการกำหนดนามแฝงคุณใช้คำสั่ง unalias ฉันได้อัปเดตคำตอบด้วยการถอดเสียงรวมถึงการใช้คำสั่งนั้นด้วย
paxdiablo

คุณจะเก็บรักษานามแฝงนี้ไว้ในเซสชันเทอร์มินัลที่แตกต่างกันอย่างไร เมื่อฉันเปิดแท็บใหม่และพยายามใช้นามแฝงนี้มันไม่ได้ผล
goldisfine

4
@goldisfine in one of the bash startup files like .bashrcดูสอดของฉัน การใส่นามแฝงลงในไฟล์เริ่มต้นที่เหมาะสมจะช่วยให้มั่นใจได้ว่าสามารถใช้ได้กับทุกเซสชัน
paxdiablo

74

มีตัวเลือกเชลล์cdable_vars:

cdable_vars
หากตั้งค่านี้อาร์กิวเมนต์ของcdคำสั่ง builtin ที่ไม่ใช่ไดเร็กทอรีจะถือว่าเป็นชื่อของตัวแปรที่มีค่าเป็นไดเร็กทอรีที่จะเปลี่ยน

คุณสามารถเพิ่มสิ่งนี้ใน.bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

สังเกตว่าฉันแทนที่เครื่องหมายตัวหนอนด้วย$HOME; ~/Files/Scripts/Mainคำพูดที่ป้องกันไม่ให้เกิดการขยายตัวและตัวหนอนทุบตีจะบ่นว่ามีไดเรกทอรีไม่มี

ตอนนี้คุณสามารถใช้สิ่งนี้ได้ดังนี้:

cd myFold

ไม่$จำเป็น นั่นคือจุดรวม - ตามที่แสดงในคำตอบอื่น ๆcd "$myFold"ทำงานได้โดยไม่มีตัวเลือกเชลล์ cd myFoldยังใช้งานได้หากเส้นทางในmyFoldมีช่องว่างไม่จำเป็นต้องมีการอ้างอิง

โดยปกติจะใช้งานได้กับการเติมแท็บอัตโนมัติเนื่องจาก_cdฟังก์ชันในการbash_completionตรวจสอบว่าcdable_varsตั้งค่าไว้หรือไม่ แต่ไม่ใช่ทุกการใช้งานจะทำในลักษณะเดียวกันดังนั้นคุณอาจต้องกำหนดแหล่งที่มาbash_completionอีกครั้งในของคุณ.bashrc(หรือแก้ไข/etc/profileเพื่อตั้งค่าตัวเลือกเชลล์)


กระสุนอื่น ๆ มีตัวเลือกที่คล้ายกันตัวอย่างเช่น Zsh ( cdablevars)


1
มีสิ่งนี้เทียบเท่ากับ ZSH หรือไม่?
Ryan Stull

1
@RyanStull setopt cdablevarsดูเหมือนจะเป็น แต่ฉันไม่รู้จัก zsh เลย
Benjamin W.

@JohnMee ฉันจะย้อนกลับการแก้ไขของคุณเนื่องจาก a) ตัวเลือกถูกเรียกแตกต่างกันใน zsh (ไม่มีขีดล่าง) b) คำถามที่ติดแท็กเพียง Bash และ c) ฉันเชื่อมโยงไปยังคู่มือ Bash ฉันจะเพิ่มย่อหน้าเพื่อพูดถึงเปลือกหอยอื่น ๆ
Benjamin W.

1
คำตอบที่ดีมาก! ขอบคุณมากสำหรับcdable_vars
Lucas P.

1
@ วลาดิสลาฟขอให้สังเกตว่าสิ่งนั้นทำลายความสมบูรณ์สำหรับการcdจัดทำโดย bash- complete ซึ่งใช้_cdฟังก์ชัน ( complete -o nospace -F _cd cd) การเพิ่ม-vไปที่ (เพื่อทำให้ตัวแปรสมบูรณ์) ทำงานได้ แต่อาจมีผลข้างเคียงที่ไม่ต้องการ - สำหรับฉันมันแสดงสภาพแวดล้อมที่สมบูรณ์ของฉันเมื่อฉันแท็บเสร็จสมบูรณ์
Benjamin W.

10

อาจจะดีกว่าถ้าใช้ลิงก์

ซอฟต์ลิงค์

ลิงก์สัญลักษณ์หรือซอฟต์ลิงก์ (ไฟล์หรือไดเร็กทอรีมีความยืดหยุ่นมากขึ้นและจัดทำเอกสารด้วยตนเอง)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

ฮาร์ดลิงค์

ฮาร์ดลิงก์ (ไฟล์เท่านั้นยืดหยุ่นน้อยกว่าและไม่จัดทำเอกสารด้วยตนเอง)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

วิธีสร้างลิงค์ไปยังไดเร็กทอรี

คำแนะนำ : หากคุณไม่ต้องการเห็นลิงก์ในบ้านคุณสามารถเริ่มต้นด้วยจุด ; จากนั้นจะถูกซ่อนโดยค่าเริ่มต้นจากนั้นคุณสามารถเข้าถึงได้เช่น

cd ~/.myHiddelLongDirLink

9

คุณสามารถเพิ่มเส้นทางใด ๆ ที่คุณต้องการไปยังแฮชแท็กของทุบตีของคุณ:

hash -d <CustomName>=<RealPath>

cd ~<CustomName>ตอนนี้คุณจะสามารถที่จะ หากต้องการทำให้ถาวรให้เพิ่มลงในสคริปต์bashrcของคุณ

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


2
ฉันคิดว่ามันจะทำงานในแต่ไม่ได้อยู่ในzsh bash
sergej

นี่เป็นคำตอบที่ดีที่สุด IMHO แต่มันใช้ได้zshเฉพาะในระบบ Ubuntu ของฉันเท่านั้น
John Stewart

6

ก่อนอื่นคุณต้องลบคำพูด:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

เครื่องหมายคำพูดจะป้องกันไม่ให้เชลล์ขยายเครื่องหมายทิลเดอร์เป็นความหมายพิเศษของการเป็น$HOMEไดเร็กทอรีของคุณ

จากนั้นคุณสามารถใช้$myFolderสภาพแวดล้อมตัวแปรเปลือก:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

ในการสร้างนามแฝงคุณต้องกำหนดนามแฝง:

alias myfolder="cd $myFolder"

จากนั้นคุณสามารถปฏิบัติต่อคำสั่งประเภทนี้:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

มันไม่ใช่ตัวแปรสภาพแวดล้อมเว้นแต่คุณexportจะเป็น
Keith Thompson

1
@KeithThompson เอาล่ะมันเป็นเพียงตัวแปรเปลือก แต่คุณไม่ต้องการส่งออกเนื่องจากไม่ต้องการให้ส่งผลกระทบต่อกระบวนการย่อย คุณกำหนดด้วยวิธีนี้ใน.bashrcไฟล์ทรัพยากรของคุณหรืออะไรก็ได้ที่คุณใช้และจะถูกกำหนดไว้ในเชลล์ทันที แต่ไม่ใช่ในเชลล์สคริปต์
David W.

ฉันชอบโซลูชันนี้เพราะทำงานร่วมกับการเติมข้อความอัตโนมัติ
Vassilis

5

ขั้นแรกคุณต้องมี$สิทธิ์เข้าถึงค่าของ "myFold" เพื่อให้โค้ดในคำถามใช้งานได้:

cd "$myFold"

เพื่อให้ง่ายขึ้นคุณต้องสร้างนามแฝงใน~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

อย่าลืมหาแหล่งข้อมูล.bashrcครั้งเดียวเพื่อทำให้นามแฝงพร้อมใช้งานในเซสชันทุบตีปัจจุบัน:

source ~/.bashrc

ตอนนี้คุณสามารถเปลี่ยนเป็นโฟลเดอร์โดยใช้:

cdmain

4

อีกทางเลือกหนึ่งคือการใช้ลิงก์สัญลักษณ์ กล่าวคือ:

ln -s ~/Files/Scripts/Main ~/myFold

หลังจากนั้นคุณสามารถดำเนินการดังต่อไป~/myFoldนี้:

cp some_file.txt ~/myFold

~/Files/Scripts/Mainซึ่งจะทำให้ไฟล์ใน คุณสามารถลบลิงก์สัญลักษณ์เมื่อใดก็ได้โดยrm ~/myFoldจะเก็บไดเรกทอรีเดิมไว้


หนึ่งข้อเสีย: ถ้าคุณcd myFoldแล้วpwdมันจะแสดงให้คุณอยู่ใน myFold นี่คือตัวแบ่งข้อตกลงสำหรับฉันเนื่องจากคำสั่งสัมพัทธ์กับการควบคุมแหล่งที่มา p4 ขึ้นอยู่กับไดเร็กทอรีปัจจุบัน
User5910

1
@ User5910 - usepwd -P
dvj

2

แต่สามารถใช้นามแฝงจริงสำหรับ dir ได้เช่นกัน

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

ด้วยวิธีนี้คุณจะมีหลักการตั้งชื่อทั่วไป (สำหรับคู่ dir / alias แต่ละคู่) และหากคุณต้องการคัดลอกบางอย่างจาก dir ปัจจุบันไปยัง myScripts คุณก็ไม่ต้องคิดถึงมัน

IHTH


1

คำตอบก่อนหน้านี้ที่ฉันพยายามไม่อนุญาตให้มีการขยายอัตโนมัติ (การเติมข้อความอัตโนมัติ) ของไดเร็กทอรีย่อยของไดเร็กทอรีนามแฝง

อย่างไรก็ตามหากคุณดันไดเร็กทอรีที่คุณต้องการใช้นามแฝงไปยังdirsสแต็ก ...

$ pushd ~/my/aliased/dir

... จากนั้นคุณสามารถพิมพ์dirs -vเพื่อดูตำแหน่งตัวเลขในสแต็ก:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

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

 $ mv foo.txt ~0  

คุณยังสามารถใช้Tabเพื่อแสดงไดเร็กทอรีย่อยของไดเร็กทอรี "aliased":

 $ cd ~0/<Tab>
 child_dir1    child_dir2

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