~ คือ $ HOME แต่บางครั้ง


14

cd ~

ทำสิ่งเดียวกัน

cd $HOME

ซึ่งก็เหมือนกัน

cd /home/tandu

อย่างไรก็ตาม

cd ~not-tandu

เปลี่ยนเป็น /home/not-tandu

นี่เป็นทางเลือกทางประโยคอย่างแท้จริงหรือไม่? สิ่งนี้ถูกจัดการโดยเคอร์เนล (หรือที่cdเรียกทำงานได้หรือไม่) มีกรณีพิเศษสำหรับ~เพิ่มเครื่องหมายทับหรือไม่ถ้าทุกอย่างถูกละเว้น? กล่าวคือ~/และ~เปลี่ยนเป็นไดเรกทอรีเดียวกัน แต่~aมีหนึ่งไดเรกทอรีขึ้น ไม่สามารถพูดถึงสิ่งเดียวกันสำหรับไดเรกทอรีอื่น ๆ ที่คุณเปลี่ยน


3
อย่าลังเลที่จะเปรียบเทียบ ~ not-tandu และ ~ / not-tandu หนึ่งจุดไปยังผู้ใช้ที่ไม่ใช่บ้านทันดูและอีกจุดหนึ่งไปยัง dir ที่ไม่ใช่ tandu ในบ้านของคุณ
Johan

4
ไม่ใช่เคอร์เนลหรือ "cd executable" (เนื่องจากไม่มีสิ่งนั้น) - เป็นเชลล์ในตัว
พอลทอมบลิน

เนื่องจากคุณไม่ได้พูดถึงมัน: cdโดยไม่มีพารามิเตอร์ใด ๆ cd ~การทำงานเช่น หากคุณแทนที่cdด้วยechoคุณสามารถดูสิ่งที่แสดงออกขยายโดยเปลือก
jofel

คำตอบ:


18

~เป็นนามแฝงที่$HOMEจัดทำโดยเชลล์จำนวนหนึ่ง แต่$HOMEมีความเป็นสากลมากกว่า $HOMEที่จริงแล้วขอให้เชลล์ใส่ (แทนที่) HOME ตัวแปรสภาพแวดล้อมที่นี่ มีตัวแปรสภาพแวดล้อมที่แตกต่างกันจำนวนมากที่สามารถทดแทนได้ลองเรียกใช้envสำหรับรายการ โปรดทราบ~ว่าไม่ได้รับการจดจำเสมอเมื่อไม่ได้อยู่ที่จุดเริ่มต้นของคำ ลองคำสั่งทั้งสองนี้เพื่อเปรียบเทียบ:

ls /~
ls /$HOME

คนแรกที่ได้รับการส่งผ่านไปยังไฟล์ปฏิบัติการ ls /~ซึ่งพยายามที่จะดูไฟล์ที่เรียกว่า~ในไดเรกทอรีรากที่สองขยาย$HOMEและกลายเป็น//home/userสิ่งที่จะถูกส่งผ่านไปยังไฟล์ปฏิบัติการ ls เป็นอาร์กิวเมนต์บรรทัดคำสั่ง ทุกระบบ POSIX (POSIX เป็นมาตรฐานสำหรับวิธี UNIX และ Linux ทำงาน) อนุญาตทับหลายที่จะได้รับการปฏิบัติเช่นเดียวกับหนึ่งเฉือนเพื่อให้เป็นเช่นเดียวกับการพูดว่า //home/user เป็นทางลัดสำหรับบอกให้เชลล์ค้นหาชื่อผู้ใช้ในไฟล์ passwd และส่งคืนโฮมไดเร็กตอรี่ของพวกเขา ไม่มีตัวแปรสภาพแวดล้อมที่เทียบเท่า การทดแทนเหล่านี้ทั้งหมดทำโดยเชลล์และได้รับการสนับสนุนโดยส่วนใหญ่ แต่เชลล์เท่านั้นที่รับประกันว่าจะได้รับการสนับสนุนจากตัวแปรสภาพแวดล้อมทั้งหมด นอกจากนี้/home/user~username$HOMEcdเป็นคำสั่งในตัว มันเป็นคำสั่งพิเศษที่บอกให้เชลล์ตัวเองเปลี่ยนไดเรกทอรี มันไม่เหมือนกับเชลล์บิวด์อินอื่น ๆ ที่สามารถนำไปใช้งานได้เหมือนกับการปฏิบัติการแยกต่างหากechoเพราะมันถูกใช้เพื่อเปลี่ยนคุณสมบัติพื้นฐานของกระบวนการเชลล์ echoเป็นเพียงเชลล์ในตัวด้วยเหตุผลด้านประสิทธิภาพ แต่ในยุคเก่าที่ดีของ UNIX นั้นมีให้ใช้งานเฉพาะเมื่อมันสามารถเรียกใช้งาน/bin/echoได้


อีกครั้ง "ซึ่งจะพยายามดูไฟล์ที่ชื่อ ~ ในไดเรกทอรีราก"; นั่นคือทั้งหมดของรสชาติยูนิกซ์?
ม้า

17

~foo หมายถึง 'ไดเรกทอรีบ้านของผู้ใช้ foo'

เคอร์เนลไม่สามารถทำได้ แต่ถูกตีความโดยเชลล์ เมื่อใดก็ตามที่เชลล์เห็น~fooว่าเป็นอาร์กิวเมนต์เชลล์จะแทนที่มันด้วยไดเรกทอรีภายในบ้านของผู้ใช้fooและส่งผ่านไปแทนที่ ดังนั้นเมื่อคุณรันcd ~tanduเชลล์จะทำงานจริงcd /home/tandu


1
สิ่งนี้แทนที่โดยเฉพาะและด้วยอัลกอริทึมแบบใด มันเป็นcdหรือเปลือก? ถ้าคุณไม่ได้ใช้เชลล์ล่ะ? มันง่ายไหมถ้า ~ ตามด้วยบางอย่าง หรือมีการจัดการพิเศษอื่น ๆ สำหรับเงื่อนไขที่ไม่ซ้ำกันนี้หรือไม่?
ยาระเบิดเมื่อ

8
ดูคู่มือการทุบตีในการขยายตัวหนอน (เชลล์และโปรแกรมอื่น ๆ อีกมากมายปฏิบัติตามกฎที่คล้ายกัน)
cjm

4
@tandu: เปลือกจะcdมีไม่ปฏิบัติการภายนอกที่จะทำมัน (มันจะเป็นไปไม่ได้)
จ้า

1
@tandu: หากคุณไม่ได้ใช้เชลล์ (เช่นลองใช้โดยใช้exec(2)) การขยายเชลล์จะไม่เกิดขึ้น หากไม่มีการขยายตัวของเชลล์~จะไม่ถูกแทนที่ด้วยสิ่งใด - เป็นเพียงตัวละครที่ใช้ได้จริงอย่างสมบูรณ์ บิตนี้ฉันใน SunOS วันแรกของฉันเพราะ/bin/shไม่ ~grok
Alexios

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