ฉันสงสัยว่าถ้าซีดีเพียงอย่างเดียวส่งฉันไปที่โฟลเดอร์บ้านและcd ~ทำแบบเดียวกันทำไม ~ ถูกเพิ่มเข้ามาตั้งแต่แรก?
เป็นสิ่งที่เฉพาะเจาะจงกับ BASH หรือว่าพวกเขาจะมีพฤติกรรมที่แตกต่างในเชลล์อื่นหรือไม่?
ฉันสงสัยว่าถ้าซีดีเพียงอย่างเดียวส่งฉันไปที่โฟลเดอร์บ้านและcd ~ทำแบบเดียวกันทำไม ~ ถูกเพิ่มเข้ามาตั้งแต่แรก?
เป็นสิ่งที่เฉพาะเจาะจงกับ BASH หรือว่าพวกเขาจะมีพฤติกรรมที่แตกต่างในเชลล์อื่นหรือไม่?
คำตอบ:
~
สามารถใช้สำหรับการมากกว่าเพียงแค่ว่า คำสั่งใด ๆ สามารถทำกำไรจากการมีทางลัดไปยังโฟลเดอร์บ้าน ดังนั้นจึงไม่จำเป็นถ้าคุณต้องการที่จะ cd เข้าไปในบ้านของคุณ แต่สิ่งที่เกี่ยวกับ~/.config
?
$ cd ~/.config
มิฉะนั้นคุณจะต้องเขียนเส้นทางบ้านใช้$HOME
var หรือทำสองcd
s นอกจากนี้สำหรับการคัดลอกหรือย้ายไฟล์:
$ cp ~/downloads/some-file some/path/
เนื่องจากไฟล์ส่วนใหญ่อยู่ในบ้านคุณจึงควรมีทางลัดอยู่เสมอ
~
ต้องทำcd ~user/download
เพื่อไปที่ไดเรกทอรีดาวน์โหลดของผู้ใช้
การทำcd
นั้นเป็นการเรียกcd
โดยไม่มีข้อโต้แย้งและตามcd
พฤติกรรม "... หากไม่ได้ระบุค่า dir ค่าของตัวแปร HOME shell จะเป็นค่าเริ่มต้น" (จากคู่มือทุบตี ) ในทางตรงกันข้ามcd ~
คือเมื่อคุณจัดหาอาร์กิวเมนต์cd
คำสั่งที่เกิดขึ้นจะเป็น~
และเปลือกจะดำเนินการตัวหนอนขยายตัว เท่าที่จะกลับไปที่โฮมไดเร็กตอรี่ของผู้ใช้ - ไม่มีความแตกต่าง ในทั้งสองกรณีHOME
ตัวแปรสภาพแวดล้อมจะถูกสอบถาม:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
cd $HOME
ได้อย่างมีประสิทธิภาพนอกจากนี้ยังมีความแตกต่างจากการไม่มี อย่างไรก็ตามในขณะที่cd
จะทำอย่างใดอย่างหนึ่งเท่านั้นตัวหนอนสามารถใช้ในการขยายตัวอื่น ๆ เช่น~+
ไดเรกทอรีการทำงานปัจจุบัน
อย่างไรก็ตามน่าสนใจพอที่เราสามารถunset HOME
ทำลายได้cd
แต่~
จะยังคงทำงาน:
$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'
bash: line 0: cd: HOME not set
/usr
/home/xieerqi
ทำไม อีกครั้งตอบในคู่มือ:
หาก HOME ไม่ได้ตั้งค่าโฮมไดเรกทอรีของผู้ใช้ที่ดำเนินการเชลล์จะถูกแทนที่แทน มิฉะนั้นคำนำหน้าตัวหนอนจะถูกแทนที่ด้วยไดเรกทอรีบ้านที่เกี่ยวข้องกับชื่อเข้าสู่ระบบที่ระบุ
ขอให้สังเกตว่าการตั้งค่าจะแตกต่างกันซึ่งทำให้ตัวแปรว่างเปล่าHOME=
และมีผล เอกสารอธิบายถึงตัวแปรที่ไม่ได้ตั้งค่าโดยเฉพาะ การทำให้ตัวแปรเท่ากับสตริงว่างมีผลตรงข้ามกับสิ่งที่เราคาดหวัง:
bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr
ที่นี่คุณจะเห็นว่าการทำให้HOME
สตริงว่างแบ่งทั้งตัวหนอนและcd
พฤติกรรม
Tilde และ$HOME
มีความแตกต่างและเหตุผลที่แตกต่างกันสำหรับการดำรงอยู่ $HOME
เป็นตัวแปรเชลล์ซึ่งบังเอิญเกิดขึ้นร่วมกับหนึ่งในตัวแปรสภาพแวดล้อม - และที่มีอยู่ในโปรแกรมทั้งหมด ใน C คุณจะใช้environ()
ในการเข้าถึง ในทางตรงกันข้ามtilde
เป็นไวยากรณ์เฉพาะเชลล์ที่ดำเนินการขยายตัวหนอนแม้ว่าคุณสามารถใช้wordexp()
ฟังก์ชั่นในการดำเนินการขยายตัวเหมือนเชลล์ ( อ้างอิง ) ใน C เช่นกัน
เหตุผลที่~
ตัวแทนHOME
ได้รับการตอบในคำถามนี้ : ตัวละครตัวหนอนแบ่งปันคีย์เดียวกันกับHOME
เทอร์มินัล Lear-Siegler ADM-3A HOME
ตรงกันข้ามเป็นตัวแปรสภาพแวดล้อมที่มีความหมายเชิงสัญลักษณ์ล้วนๆและไม่มีการแสดงออกทางกายภาพ
นอกจากนี้ความจริงที่ว่าHOME
เป็นตัวแปรสภาพแวดล้อมทำให้เราสามารถยกเลิกการตั้งค่าได้เนื่องจากในขณะที่เราไม่สามารถตั้งค่า~
เป็นอย่างอื่นได้ด้วยวิธีการง่ายๆ
# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'
/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'
/home/xieerqi
สังเกตุเห็นบรรทัดว่างที่แรกecho
ส่งออกตัวแปร unset และข้อเท็จจริงที่ว่า ในทางตรงกันข้ามเราไม่สามารถทำสิ่งนี้กับตัวหนอนได้:
$ bash -c '~=; cd ~;pwd'
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi
อย่างไรก็ตามการเปลี่ยนแปลงHOME
จะมีผลกับ~
:
$ env 'HOME=' bash -c 'echo $HOME; stat ~;'
stat: cannot stat '': No such file or directory
นอกจากนี้เนื่องจาก~
ทำงานเป็นอักขระการขยายเราสามารถทำสิ่งนี้เพื่อแสดงไดเรกทอรีการทำงานปัจจุบัน:
$ bash -c 'cd /etc/;stat -c "%n" ~+'
/etc
โดยที่ถ้าเราต้องการทำสิ่งนั้นผ่านตัวแปรสภาพแวดล้อมเราต้องการPWD
และHOME
ยังคงเหมือนเดิมหรือถ้าคุณทำสิ่งต่าง ๆ เช่นecho $HOME+
- นั่นเป็นเพียงการต่อสตริง / ตัวแปรเท่านั้น แต่~+
นำข้อมูลออกมาจากตัวแปรสภาพแวดล้อมอีกครั้ง:
$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'
/usr
หมายเหตุ : ตัว~+
และ~-
การขยายงานในแต่ไม่ได้อยู่ในksh
dash
ในการตอบคำถามเฉพาะของคุณ:
เป็นสิ่งที่เฉพาะเจาะจงกับ BASH หรือว่าพวกเขาจะมีพฤติกรรมที่แตกต่างในเชลล์อื่นหรือไม่?
ไม่สิ่งนี้ควรเป็นพฤติกรรมที่สอดคล้องกัน ksh
, dash
และcsh
- ทั้งหมดประพฤติเช่นเดียวกันกับหรือcd
cd ~
ทำไม ~ ถูกเพิ่มเข้ามาในตอนแรก?
ฉันจะบอกว่าความสะดวกสบายและเหตุผลทางประวัติศาสตร์ตามที่อธิบายไว้ในคำตอบที่เชื่อมโยงเกี่ยวกับตัวหนอน ในที่สุดมันก็เริ่มทำงานได้มากกว่าการขยายโฮมไดเร็กตอรี่
ไม่ว่าคุณจะมีหลายระดับโฟลเดอร์ด้านบนหรือด้านล่าง$HOME
คำสั่งcd
และcd ~
ทำสิ่งเดียวกันและไม่แตกต่างกัน - มันจะส่งคุณกลับไปยังไดเรกทอรีหน้าแรกของคุณ
อย่างไรก็ตามเมื่อคุณมี 1 หรือโฟลเดอร์มากขึ้นในระดับที่เหนือบ้านและคุณต้องการที่จะไปโดยตรงไปยังไดเรกทอรีย่อย 1 หรือระดับโฟลเดอร์เพิ่มเติมด้านล่าง$HOME
, ตัวหนอน ( ~
) มาในสะดวกโดยคุณประหยัดการกดแป้นพิมพ์เมื่อนำมาใช้เพื่อทดแทนข้อความที่จำเป็นในการดู ไป$HOME
เมื่อพิมพ์cd
คำสั่ง ตัวอย่างเช่น
/$ cd # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3 # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
~ ย่อมาจาก / home / ตำแหน่งผู้ใช้ดังนั้นคุณจึงประหยัดเวลาเมื่อพิมพ์ ตัวอย่างเช่น cd / home / ชื่อผู้ใช้ / ดาวน์โหลดเหมือนกับ cd ~ / Downloads แต่พิมพ์น้อยกว่า ทั้งสองคำสั่งทำแบบเดียวกันเปลี่ยนไดเรกทอรีทำงานเป็นตำแหน่งนั้น
root
ไดเรกทอรีภายในบ้านของEg มักอยู่นอกบ้าน/home
cd ~
VS VScd $HOME
cd ~not-tandu
คำถามนี้เป็นคำถามที่ถามเกี่ยวกับVScd
cd ~