ความแตกต่างระหว่าง $ HOME และ ~


31

$HOMEและ~มักจะอ้างถึงสิ่งเดียวกัน นั่นคือพวกเขาเป็นเส้นทางไปยังไดเรกทอรี "บ้านของผู้ใช้" ซึ่งเป็นรูปแบบทั่วไป "/ home / ชื่อผู้ใช้"

เมื่อใดหากเคยทำสิ่งเหล่านี้จะไม่อ้างถึงไดเรกทอรีเดียวกัน?


11
~มีเปลือกขึ้นอยู่ในขณะที่ $ HOME ไม่
Kulfy

คำตอบ:


45

ทั้งสอง$HOMEและ~ชี้ไปที่โฟลเดอร์เดียวกันโฟลเดอร์บ้านของผู้ใช้ปัจจุบัน แต่ทั้งคู่ต่างกันมาก

  • $HOMEเป็นตัวแปรสภาพแวดล้อมที่ถูกตั้งค่าให้มีโฟลเดอร์บ้านของผู้ใช้ปัจจุบัน
  • ~เป็นสัญลักษณ์ส่วนขยายของเชลล์กล่าวคือหนึ่งในสัญลักษณ์ที่ถูกประมวลผลก่อนที่จะดำเนินการคำสั่งจริง ~ขยายเป็นค่า $ HOME เพียงอย่างเดียว ขยายไปยังไดเรกทอรีบ้านของผู้ใช้~nemo nemoสัญลักษณ์การขยายเชลล์คืออักขระ (หรือคู่ของอักขระ) ที่ประมวลผล / ตีความโดยเชลล์เพื่อสร้างคำสั่งจริง ตัวอย่างของสัญลักษณ์การขยายเชลล์คือ*ซึ่งใช้เพื่อขยายชื่อไฟล์

1
~ขยายเป็น $ HOME หรือ% APPDATA% บน Windows หากไม่ได้กำหนดไว้ระบบจะค้นหาพา ธ ใน "ฐานข้อมูลรหัสผ่าน" (ซึ่งโดยปกติจะหมายถึง/etc/passwdแต่อาจเป็น LDAP หรือแหล่งข้อมูลอื่น) ประมาณ 20 ปีที่แล้วคุณอาจถูกเตือนว่า $ HOME อาจไม่ได้ตั้งค่าไว้ในเครื่องบางเครื่องในขณะที่~รับประกันว่าจะขยายเป็นบางอย่าง
Mirek Długosz

ความแตกต่างนี้มีความโดดเด่นในโปรแกรมเช่นทำเมื่อคุณจำเป็นต้องรู้ว่าคุณต้องการจากสองแบบใดบ้าง
D. Ben Knoble

3
@ MirekDługoszอย่างน้อยในทุบตีคอมไพล์บน Windows, ~ขยาย$HOME(เท่ากับ$HOMEPATH) $APPDATAไม่ใช่ และใน cmd.exe ~ไม่ขยาย
hyde

1
@vanadium HOMEเป็นตัวแปรสภาพแวดล้อม (แนวคิด OS, ในsh shells ตัวอย่างเช่น set with exportor declare -x), ไม่ใช่ตัวแปร shell (นิยามที่ขึ้นอยู่กับเชลล์ทั้งหมด, แต่ในsh shell นั้นมักจะถูกตั้งค่าด้วยfoo=valueหรือกับsetหรือในอีกไม่กี่ตัว) วิธี)
hyde

1
@ ฉันคิดว่าฉันผิด bash จะตรวจสอบ $ HOME หากยังไม่ได้ตั้งค่ามันจะตรวจสอบ% APPDATA% แต่เฉพาะใน Windows เท่านั้น หากไม่ได้ตั้งค่าไว้จะค้นหา "ฐานข้อมูลรหัสผ่าน" ดูgit.savannah.gnu.org/cgit/bash.git/tree/lib/readline/ …
Mirek Długosz

17

วิธีหนึ่งที่ต่างกันคือวิธีที่เชลล์ Bash แปลงพวกมันเมื่ออยู่ใน"เครื่องหมายอัญประกาศ

ถ้าคุณใช้echoเช่นนี้โดยไม่มีคำพูดใด ๆ แล้ว~และ$HOMEมีผลเช่นเดียวกัน:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

อย่างไรก็ตามด้วย"เครื่องหมายคำพูดล้อมรอบผลลัพธ์จะแตกต่างกัน:

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~ขยายเป็นส่วนหนึ่งของคำนำหน้าตัวหนอนเท่านั้นซึ่งตามคำจำกัดความต้องเริ่มต้นที่จุดเริ่มต้นของคำ นอกจากนี้เนื่องจากครั้งหนึ่งเคยเป็นส่วนหนึ่งของรูปแบบการวนรอบ~จะไม่ทำงานภายในเครื่องหมายคำพูดคู่ ดังนั้น"~"หรือa~bจะส่งผลใน~การรักษาคุณค่าตามตัวอักษร

หนึ่ง~(หรือ~ตามมาด้วย/) จะขยายไปยังบ้านของผู้ใช้ปัจจุบัน:

$ echo ~/.ssh
/home/user/.ssh

~ตามด้วยชื่อผู้ใช้จะขยายไปยังโฟลเดอร์ภายในบ้านของผู้ใช้ว่า:

$ echo ~root/.ssh
/root/.ssh

~ตามด้วย+หรือ-และจำนวนตัวเลือกจะขยายไปยังองค์ประกอบของสแต็คไดเรกทอรี :

$ cd /etc
$ echo ~+0
/etc

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


3

มันขึ้นอยู่กับการขยายตัว ใน bash ~เป็นวิธีที่สะดวกในการรับโฮมไดเร็กตอรี่โดยไม่ทริกเกอร์การขยายชื่อไฟล์หรือการแยกคำแม้ว่ามันจะไม่ได้อ้างถึงก็ตาม ตัวอย่างเช่น:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

หรือ:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

ดังนั้นหากคุณกำลังต่อสู้ด้วยคำพูดด้วยเหตุผลบางอย่าง (ซึ่งในกรณีนี้คุณควรคิดใหม่ทั้งหมดมันง่ายกว่าที่จะต่อสู้กับหมู) ~อาจจะสะดวกกว่า


อื่น ๆ ในหลามตัวอย่างเช่น~และ$HOMEจะต้องมีการขยายตัวที่แตกต่างกัน ฟังก์ชั่น สถานที่อื่น ๆ บางแห่งอนุญาตให้ใช้ตัวแปรและไม่อนุญาตให้ใช้ไวยากรณ์เชลล์อื่น ๆ เช่นไวด์การ์ดหรือการขยายตัวหนอน (เช่น~/.pam_environmentมีไวยากรณ์พิเศษสำหรับการขยายตัวแปร) แต่สถานที่อื่น ๆ ช่วยให้การขยายตัวหนอนเป็นข้อยกเว้น (เช่นsystemd ) แต่การค้นหาฐานข้อมูล passwd $HOMEโดยตรงแทนการใช้


ความแตกต่างใหญ่อีกอย่างที่คุณแสดงที่นี่ แต่ไม่ได้เอ่ยถึงคือคุณสามารถเปลี่ยนค่าได้$HOMEแต่คุณไม่สามารถเปลี่ยนค่าของ (โดยตรง) ~ได้
โจ

ดังนั้นฉันจึงถามเมื่อทำ$HOMEและ~ไม่อ้างถึงสิ่งเดียวกัน - ปกติแล้วพวกเขาจะทำตามค่าเริ่มต้น - จากนั้นคุณจงใจกำหนดตัวแปรสภาพแวดล้อมเพื่อให้พวกเขาไม่ได้อ้างถึงสิ่งเดียวกัน นี่เป็นการสาธิตที่ดี แต่ก็ทำให้สับสนโดยไม่จำเป็น
H2ONaCl

1

$ HOME / มีแนวโน้มที่จะทำงานใน POSIX.2 มาตรฐาน Bourne / bin / sh เนื่องจากการขยายตัวหนอนเป็นส่วนขยายที่พบใน BSD csh tcsh GNU ทุบตีและอื่น ๆ

หากคุณต้องการเขียนสคริปต์แบบพกพาไปยัง busybox หรือ dash หรือ BSD sh ให้ลงทุนในตัวอักษรพิเศษเพื่อมิให้คุณผิดพลาดด้วย ~ /: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวในระบบบางระบบ

ฉันยังพบว่า $ HOME / อ่านได้มากขึ้น


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