สร้างทางลัดอื่น `~~ 'เช่น' ~ '(โฮมไดเร็กตอรี่)


10

ฉันต้องการ~~ชี้ไปที่ไดเรกทอรีอื่นเพื่อให้ฉันสามารถใช้เป็นทางลัด ~ฉันต้องการให้มีฟังก์ชันเดียวกันตรงตามที่ ฉันจะทำสิ่งนี้ได้อย่างไร


2
คุณอาจจะดีกว่าด้วยไดเรกทอรีที่มีชื่อ zsh
Michael Mrozek

เพิ่งพบวิธีแก้ปัญหาที่น่าสนใจสำหรับsuperuser.com/a/565825/398328
VarunAgw

1
@VarunAgw ฮ่า ๆ ๆ ตลก ๆ แล้วฉันก็คิดแบบเดียวกัน ความอัปยศ. ฉันคิดว่าฉันเป็นผีเสื้อที่มีเอกลักษณ์ไม่กี่นาที :(
เกรวี่

คำตอบ:


14

จริงๆแล้วมีวิธีมันไม่ใช่วิธีที่ดี แต่เป็นวิธีฮ่าฮ่า!

เพิ่มสิ่งต่อไปนี้ใน/etc/passwdไฟล์ของคุณ:

~:x:1111:99:special Character user:/test:/sbin/nologin

แทนที่1111เป็น UID ด้วยสิ่งที่สมเหตุสมผลแทนที่/testด้วยไดเรกทอรีที่คุณต้องการ ~~ เพื่อเลียนแบบ

99ในระบบของฉันคือnobodyกลุ่มที่ฉันแนะนำถ้าคุณทำเช่นนี้เพื่อให้แน่ใจว่าเป็นกลุ่มที่ไม่มีสิทธิ์ในไฟล์ใด ๆ ที่จะถูกใช้งาน ตามหลักเหตุผล/sbin/nologinในฐานะเชลล์มันไม่ควรใช้มันก็จะไม่มี/etc/shadowรายการดังนั้นมันจะไม่มีรหัสผ่าน ในทางทฤษฎีควรจะดี แต่ให้แน่ใจว่าจะไม่ให้คุณเข้าสู่ระบบเป็นบัญชี

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

แก้ไข: เพื่อประโยชน์ครบถ้วนนี้ได้รับการแนะนำโดย VarunAgw: คุณสามารถเพิ่มผู้ใช้เป็นปกติuseradd -s /sbin/nologin -N tmpแล้วปรับเปลี่ยน/etc/passwdและ/etc/shadowการเปลี่ยนแปลงการใช้tmpเพื่อ~และเปลี่ยนสถานที่ตั้งของhome directory


แทนที่จะเปลี่ยน UID และ GID เราสามารถทำได้useradd 'tmp'แล้วแทนที่tmpด้วย~
VarunAgw

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

8

คุณสามารถใช้ประโยชน์จาก CDPATH และใส่ชื่อ~~ ไดเรกทอรีในส่วนประกอบ CDPATH ของคุณ

จากman bash(แต่ CDPATH สามารถใช้ได้แม้ในsh)

พา ธ การค้นหาสำหรับคำสั่ง cd นี่เป็นรายการไดเร็กทอรีที่คั่นด้วยโคลอนซึ่งเชลล์ค้นหาไดเร็กทอรีปลายทางที่ระบุโดยคำสั่ง cd ค่าตัวอย่างคือ ".: ~: / usr"

cd ~~ที่จะช่วยให้คุณทำ

ถ้าคุณต้องการทำสิ่งต่าง ๆ เช่นvi ~~/someFileจากที่ใด ๆ ในแผนผังไดเรกทอรีคุณก็จะโชคไม่ดีถ้าคุณยืนยันอย่าง~~แท้จริงยกเว้นว่าคุณแฮ็คเชลล์คุณสามารถใช้ตัวแปรหรือตัวแปรสภาพแวดล้อมเพื่อจัดเก็บไดเรคทอรีเวทของคุณเพื่อให้คุณสามารถทำได้ , เช่น,$tilda/someFile

ฉันมักจะใส่ไฟล์มักจะเข้าถึงได้ภายในไดเรกทอรีที่มีชื่อในไม่ช้าในไดเรกทอรีบ้านของฉันดังนั้นฉันสามารถเข้าถึงพวกเขาด้วยเช่นเส้นทางหรือ~/b~/l

โดยปกติคุณสามารถแทนที่ไดเรกทอรีด้วย symlink เป็นไดเรกทอรีได้มากเท่าที่คุณต้องการ


1

การ~ขยายตัวหนอนของเชลล์นั้นส่วนใหญ่สามารถตั้งโปรแกรมได้ มันจะขยายไปยังไดเรกทอรีผู้ใช้ของชื่อผู้ใช้ระบบประกาศในบริบทต่อท้ายของมัน(และโซลูชั่นที่ยอดเยี่ยมตามสายเหล่านี้ได้รับการเสนอแล้ว)ค่าของ$HOMEตัวแปรเชลล์หรือไม่เลย

ดังนั้น:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

ฉันเปลี่ยน$HOMEตลอดเวลาและฉันเก็บฟังก์ชั่นในไฟล์สภาพแวดล้อมของเชลล์เพื่อรีเซ็ต:

home(){
    HOME=~$USER
    cd ~; pwd
}

หากคุณต้องการใช้~เครื่องหมายตัวหนอนด้วยวิธีใดวิธีหนึ่งที่ไม่ได้อ้างถึงไดเรกทอรีบ้านของคุณให้ทำเช่นนั้น $HOMEเพียงแค่มอบหมาย อย่ากลัวมัน $HOMEเป็นเพียงตัวแปรเชลล์เหมือนอย่างอื่น


ข้อเสนอแนะก็ฉันมีเพียงการขยายตัวเล็กน้อย @ คำแนะนำที่ดี PSkocik $CDPATHเกี่ยวกับการใช้ สิ่งหนึ่งที่เขาไม่ได้กล่าวถึงคือคุณสามารถใช้และปรับเปลี่ยน$CDPATHinline ได้โดยไม่ต้องเปลี่ยนค่า shell ปัจจุบันสำหรับ$CDPATHเลย ตัวอย่างเช่น:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdจำเป็นต้องเป็น shell builtin แต่ไม่ใช่ POSIX shell พิเศษในตัวดังนั้นการประกาศค่าสำหรับ$CDPATHจะไม่ส่งผลกระทบต่อค่า shell ปัจจุบัน หากคุณใช้ตามที่ฉันได้ทำไว้$CDPATHค่าของข้างต้นจะเปลี่ยนเฉพาะสำหรับสภาพแวดล้อมของcdคำสั่งเดียวและจะคืนค่าเป็นค่าก่อนหน้าหลังจากนั้น ฉันมักจะพบว่าเทคนิคดังกล่าวมีประโยชน์มากที่สุดเมื่อใช้ร่วมกับการทำให้ประวัติสมบูรณ์ ฉันจะทำสิ่งข้างต้นเปลี่ยนเป็นไดเรกทอรีเรียกใช้คำสั่งไม่กี่คำจากนั้นกดขึ้นจนกว่าฉันจะกลับมาที่cdคำสั่งของฉันและถอยกลับส่วนเส้นทางหรือสองเพื่อย้ายที่อื่น


ทีนี้ถ้าคุณรวมสองแนวคิดนี้เข้าด้วยกันคุณสามารถทำให้คำสั่งที่ใช้ก่อนหน้านี้มีความหมายแตกต่างกันโดยสิ้นเชิงในครั้งต่อไปที่คุณใช้

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

ทำงานได้อย่างสมบูรณ์เช่นเดียวกับฟังก์ชั่นทุบตี:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

นี่เป็นอีกวิธีหนึ่งที่ใกล้เข้ามาเล็กน้อย (ฉันรู้ว่าฉันไม่ได้ใกล้เคียงกับข้อกำหนด)

function ~~ { echo /test; }

จากนั้นมีตัวละครอีกสองสามตัว:

cd `~~`/subdir
vi `~~`/file

2
ดีcd ~~/foo/barไม่ได้ไปทำงานให้ดีหรือvim ~~/foo.txtฯลฯ ...
derobert

1
คำถามไม่ชัดเจน หากเป็นการใช้งานที่ต้องการฉันจะใช้CDPATHตัวแปรเพื่อจัดการcdกรณีและปัญหา
เกล็นแจ็คแมน

ยอมรับว่ามันยังไม่ชัดเจน แต่ OP ขอให้มันใช้งาน~ได้ และ~ไม่ได้ใช้เหมือนคำสั่ง
Derobert

ฉันพบว่ามันค่อนข้างเข้าใจตัวเองได้หากไม่ได้สะกดอย่างสมบูรณ์ ปัญหาที่เกิดขึ้นกับCDPATHมันคือมันไม่ทำงานสำหรับคำสั่งนอก .... ซีดี IE คุณทำได้cd ~~หรือcd ~~/testdir1ไม่เห็นด้วยvim ~~testdir1
Gravy

คุณอาจทำได้ดีกว่าด้วยนามแฝงที่เรียกใช้ฟังก์ชัน ชอบalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.