$HOME
และ~
มักจะอ้างถึงสิ่งเดียวกัน นั่นคือพวกเขาเป็นเส้นทางไปยังไดเรกทอรี "บ้านของผู้ใช้" ซึ่งเป็นรูปแบบทั่วไป "/ home / ชื่อผู้ใช้"
เมื่อใดหากเคยทำสิ่งเหล่านี้จะไม่อ้างถึงไดเรกทอรีเดียวกัน?
$HOME
และ~
มักจะอ้างถึงสิ่งเดียวกัน นั่นคือพวกเขาเป็นเส้นทางไปยังไดเรกทอรี "บ้านของผู้ใช้" ซึ่งเป็นรูปแบบทั่วไป "/ home / ชื่อผู้ใช้"
เมื่อใดหากเคยทำสิ่งเหล่านี้จะไม่อ้างถึงไดเรกทอรีเดียวกัน?
คำตอบ:
ทั้งสอง$HOME
และ~
ชี้ไปที่โฟลเดอร์เดียวกันโฟลเดอร์บ้านของผู้ใช้ปัจจุบัน แต่ทั้งคู่ต่างกันมาก
$HOME
เป็นตัวแปรสภาพแวดล้อมที่ถูกตั้งค่าให้มีโฟลเดอร์บ้านของผู้ใช้ปัจจุบัน~
เป็นสัญลักษณ์ส่วนขยายของเชลล์กล่าวคือหนึ่งในสัญลักษณ์ที่ถูกประมวลผลก่อนที่จะดำเนินการคำสั่งจริง ~
ขยายเป็นค่า $ HOME เพียงอย่างเดียว ขยายไปยังไดเรกทอรีบ้านของผู้ใช้~nemo
nemo
สัญลักษณ์การขยายเชลล์คืออักขระ (หรือคู่ของอักขระ) ที่ประมวลผล / ตีความโดยเชลล์เพื่อสร้างคำสั่งจริง ตัวอย่างของสัญลักษณ์การขยายเชลล์คือ*
ซึ่งใช้เพื่อขยายชื่อไฟล์~
ขยายเป็น $ HOME หรือ% APPDATA% บน Windows หากไม่ได้กำหนดไว้ระบบจะค้นหาพา ธ ใน "ฐานข้อมูลรหัสผ่าน" (ซึ่งโดยปกติจะหมายถึง/etc/passwd
แต่อาจเป็น LDAP หรือแหล่งข้อมูลอื่น) ประมาณ 20 ปีที่แล้วคุณอาจถูกเตือนว่า $ HOME อาจไม่ได้ตั้งค่าไว้ในเครื่องบางเครื่องในขณะที่~
รับประกันว่าจะขยายเป็นบางอย่าง
~
ขยาย$HOME
(เท่ากับ$HOMEPATH
) $APPDATA
ไม่ใช่ และใน cmd.exe ~
ไม่ขยาย
HOME
เป็นตัวแปรสภาพแวดล้อม (แนวคิด OS, ในsh shells ตัวอย่างเช่น set with export
or declare -x
), ไม่ใช่ตัวแปร shell (นิยามที่ขึ้นอยู่กับเชลล์ทั้งหมด, แต่ในsh shell นั้นมักจะถูกตั้งค่าด้วยfoo=value
หรือกับset
หรือในอีกไม่กี่ตัว) วิธี)
วิธีหนึ่งที่ต่างกันคือวิธีที่เชลล์ Bash แปลงพวกมันเมื่ออยู่ใน"
เครื่องหมายอัญประกาศ
ถ้าคุณใช้echo
เช่นนี้โดยไม่มีคำพูดใด ๆ แล้ว~
และ$HOME
มีผลเช่นเดียวกัน:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
อย่างไรก็ตามด้วย"
เครื่องหมายคำพูดล้อมรอบผลลัพธ์จะแตกต่างกัน:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~
ขยายเป็นส่วนหนึ่งของคำนำหน้าตัวหนอนเท่านั้นซึ่งตามคำจำกัดความต้องเริ่มต้นที่จุดเริ่มต้นของคำ นอกจากนี้เนื่องจากครั้งหนึ่งเคยเป็นส่วนหนึ่งของรูปแบบการวนรอบ~
จะไม่ทำงานภายในเครื่องหมายคำพูดคู่ ดังนั้น"~"
หรือa~b
จะส่งผลใน~
การรักษาคุณค่าตามตัวอักษร
หนึ่ง~
(หรือ~
ตามมาด้วย/
) จะขยายไปยังบ้านของผู้ใช้ปัจจุบัน:
$ echo ~/.ssh
/home/user/.ssh
~
ตามด้วยชื่อผู้ใช้จะขยายไปยังโฟลเดอร์ภายในบ้านของผู้ใช้ว่า:
$ echo ~root/.ssh
/root/.ssh
~
ตามด้วย+
หรือ-
และจำนวนตัวเลือกจะขยายไปยังองค์ประกอบของสแต็คไดเรกทอรี :
$ cd /etc
$ echo ~+0
/etc
$HOME
มีค่าเท่ากับหนึ่ง~
ซึ่งแทนที่จะเป็นไปตามกฎไวยากรณ์สำหรับตัวแปร ตัวอย่างเช่นมันขยายภายในเครื่องหมายคำพูดคู่สามารถยกเลิกการตั้งค่าและตัวถูกดำเนินการจัดการสตริงสามารถนำไปใช้กับมัน
มันขึ้นอยู่กับการขยายตัว ใน 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
และ~
ไม่อ้างถึงสิ่งเดียวกัน - ปกติแล้วพวกเขาจะทำตามค่าเริ่มต้น - จากนั้นคุณจงใจกำหนดตัวแปรสภาพแวดล้อมเพื่อให้พวกเขาไม่ได้อ้างถึงสิ่งเดียวกัน นี่เป็นการสาธิตที่ดี แต่ก็ทำให้สับสนโดยไม่จำเป็น
$ HOME / มีแนวโน้มที่จะทำงานใน POSIX.2 มาตรฐาน Bourne / bin / sh เนื่องจากการขยายตัวหนอนเป็นส่วนขยายที่พบใน BSD csh tcsh GNU ทุบตีและอื่น ๆ
หากคุณต้องการเขียนสคริปต์แบบพกพาไปยัง busybox หรือ dash หรือ BSD sh ให้ลงทุนในตัวอักษรพิเศษเพื่อมิให้คุณผิดพลาดด้วย ~ /: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวในระบบบางระบบ
ฉันยังพบว่า $ HOME / อ่านได้มากขึ้น
$HOME
~
อดีตตัวเองของฉันอาจรู้สิ่งนี้
~
มีเปลือกขึ้นอยู่ในขณะที่ $ HOME ไม่