การใช้เครื่องหมายตัวหนอนทำงานเป็นทางลัดไปยังไดเรกทอรีบ้านของฉันอย่างไร


30

ฉันสับสนกำลังพยายามคัดลอกไฟล์จากพีซีเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง ฉันคิดออกแล้ว แต่ซินแท็กซ์ยังสับสนอยู่ งานนี้:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

ซึ่งทำให้ในโฟลเดอร์Volenteer.png /home/j0h/bอย่างไรก็ตามวิธีนี้ใช้ไม่ได้:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

สิ่งนี้ล้มเหลวเช่นกันทำให้ไม่พบไฟล์สถานะการออก 1:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

เช่นนี้:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

เห็นได้ชัดว่ามีความแตกต่างระหว่าง~และ~/ ความแตกต่างนั่นคือการปรากฏตัวของ/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

เหตุใดจึงเป็นเช่นนี้ใน scp การ~แก้ไขเพื่อ~/? นั่นคือการเดาฉันไม่สามารถยืนยันได้ว่าเกิดอะไรขึ้น แต่ดูเหมือนจะไม่สอดคล้องกันและทำให้เกิดความสับสน นี่เป็นข้อบกพร่องใน scp หรือไม่ หรือมีบางอย่างเกี่ยวกับตัวหนอนฉันหายไป?


2
เพียงแค่ข้อความด้านข้างที่นี่มันสะกด "อาสาสมัคร" ด้วย "u" แทนที่จะเป็น "e" :)
AER

2
ฉันเป็นคนสะกดคำเสรี
j0h

คำถามที่เกี่ยวข้อง: askubuntu.com/q/972319/295286
Sergiy Kolodyazhnyy

คำตอบ:


68

~ เป็นไดเรกทอรีบ้านของคุณ

~fooเป็นโฮมไดเร็กตอรี่ของผู้ใช้foo, หากมีผู้ใช้ดังกล่าว, หรือเป็นเพียงไดเร็กตอรี่ที่ตั้งชื่อ~foo, หากผู้ใช้นั้นไม่มีอยู่.


ดังนั้นใน:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktopจะขยายไปยังโฮมไดเร็กตอรี่ของผู้ใช้Desktopถ้ามีผู้ใช้ดังกล่าวอยู่ (และโดยปกติแล้วจะไม่มี) หรือเป็นเพียงแค่~Desktop(พา ธ ที่มักไม่มีอยู่ด้วย)


ใน:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hจะขยายไปยังไดเรกทอรีที่มีชื่อj0hในjayโฮมไดเรกทอรีซึ่งไม่น่าจะมีอยู่อีก


มันไม่ได้~และ~/ที่แตกต่างเกิดขึ้น แต่ในและ~~foo


นอกจากนี้~ยังสามารถใช้สำหรับการนำทางประวัติไดเรกทอรี:

  • ~-เป็นไดเรกทอรีการทำงานก่อนหน้า (เช่น$OLDPWD)
  • ~+เป็นไดเรกทอรีการทำงานปัจจุบัน (เช่น$PWD)

สิ่งนี้ไม่สามารถใช้ได้scpเนื่องจากคุณไม่ได้รับการเปลี่ยนไดเรกทอรีในระหว่างการscpดำเนินการ

และถ้าคุณใช้pushdและpopdเพื่อรักษาสแต็คไดเรกทอรีและจะเป็นไดเรกทอรี TH ในกองไดเรกทอรีเท่าที่เห็นในการส่งออกของ จะเป็นไดเรกทอรี th จากจุดสิ้นสุด (นับจากศูนย์ทั้งสองกรณี) ตัวอย่างเช่น:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

จากนั้นไดเรกทอรีในสแต็กสามารถเข้าถึงได้โดยใช้:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-

ดังนั้น~+จะเท่ากับเสมอ.ใช่ไหม ดูเหมือนจะซ้ำซ้อน
Wildcard

1
@ Wildcard กันแน่ ~+และ~-ใช้ค่าของ$PWDและ$OLDPWDซึ่งเป็นพา ธ สัมบูรณ์ .เป็นเส้นทางที่สัมพันธ์กันเสมอ ดังนั้นหากมีคำสั่งที่เปลี่ยนไดเรกทอรีการทำงานปัจจุบันเมื่อดำเนินการมันจะเห็นเส้นทางใหม่สำหรับ.ที่เส้นทางขยายโดย~-จะยังคงเหมือนเดิม tar -Cเป็นตัวอย่าง ~+แต่ผมยอมรับว่าผมไม่สามารถคิดของการใช้งานที่ดีสำหรับ $PWDจะดีเหมือนกันยกเว้นว่าคุณไม่จำเป็นต้องพูด~+/foo/barถ้า$PWDมีช่องว่าง
muru

1
ขอบคุณที่อธิบายให้ชัดเจน ที่จริงแล้วเป็นตัวอย่างการใช้งานที่ดีตรงนั้น: คำสั่งบางคำสั่งปฏิเสธที่จะทำงานบนพา ธ ที่เกี่ยวข้องเพื่อเหตุผลด้านความปลอดภัย ด้วยคำสั่งดังกล่าวคุณไม่สามารถใช้./filenameแต่สามารถใช้"$PWD/filename"หรือมากกว่า~+/filenameนั้น (และบางคำสั่งจะทำงานกับชื่อพา ธ สัมพัทธ์ แต่มีความแตกต่างการทำงานเช่นlnหรือtar.)
Wildcard

21

อ่านเอกสาร GNU เพื่ออ่านการขยายตัวของ Bash Tilde (อย่างที่ฉันควรจะมีก่อนการตอบซ้ำครั้งแรกของคำตอบนี้)

~/Desktopและ~j0hกำลังทำสิ่งที่แตกต่างกันโดยพื้นฐานซึ่งอธิบายว่าทำไม~Desktopไม่ทำงาน:

  • ล้วน~ถูกทดแทนสำหรับ$HOMEตัวแปรสภาพแวดล้อมปัจจุบันของคุณตั้งค่าการเข้าสู่ระบบ ดังนั้น~หายไป/home/oliสำหรับฉันและอ่านเป็น~/Desktop /home/oli/Desktopนี่คือที่ที่คุณเห็น tilda ที่ใช้มากที่สุด

  • ~usernameแก้ไขไปที่บ้านของผู้ใช้ที่/etc/passwdเป็นชุดใน ดังนั้น~oliหายไป/home/oli, ~j0hอาจแก้ไขไป/home/j0hแต่ไม่ neccessarily, homedir ของคุณได้ทุกที่

  • ~not-a-usernameไม่สามารถแก้ไขได้ เนื่องจากDesktopไม่ใช่ผู้ใช้~Desktopจึงไม่ถูกแทนที่ มันถูกใช้อย่างแท้จริงเป็นไฟล์หรือเส้นทางที่มีชื่อ~Desktop(ซึ่งไม่มีอยู่ที่นี่)

และไม่จำเป็นต้องบอกว่าทั้งหมดนี้เกิดขึ้นจากระยะไกล (มันจะไร้ประโยชน์scpถ้ามันถูกแทนที่ด้วยค่าท้องถิ่น) สิ่งนี้ได้ผลเพราะ Bash จะไม่ทดแทน~...หากนำหน้าด้วยอะไรก็ได้ยกเว้นช่องว่าง


สิ่งที่ไม่getent passwd binพูด?
muru

2
"bin" เป็นผู้ใช้ระบบบนเครื่องลีนุกซ์ส่วนใหญ่โดยมีโฮมไดเร็กตอรี่ของ / bin
fNek

1
ความล้มเหลวในการขยาย~dirสอดคล้องกับเอกสาร GNU: "... อักขระในคำนำหน้าตัวหนอนที่ต่อท้ายตัวหนอนจะถือว่าเป็นชื่อล็อกอินที่เป็นไปได้... หากชื่อล็อกอินไม่ถูกต้องหรือการขยายตัวตัวหนอนล้มเหลวคำว่า ไม่มีการเปลี่ยนแปลง " ที่นี่dirไม่ใช่ชื่อของผู้ใช้ในระบบนี้ดังนั้นจึงไม่มีการเปลี่ยนแปลง
apsillers

ขอบคุณทุกคน ฉันอาจจะอ่านการเชื่อมโยงที่ผมโพสต์ :)
Oli

4

สัญลักษณ์~ที่ใช้เป็นทางลัดสำหรับ/home/userในbashดังนั้นในกรณีของมันเป็นชวเลข~/Desktop/Volenteer.png/home/user/Desktop/Volenteer.png

ดังนั้นตามที่คุณเห็นการ/แสดงระดับใหม่ในลำดับชั้นของระบบไฟล์


3
เพียงครึ่งเดียวเท่านั้นมันเป็นชวเลขของตัวแปรสภาพแวดล้อม $ HOME ~{user}/อาจเป็นเส้นทางแบบสุ่มใด ๆ ตามที่กำหนดโดยไฟล์ฐานข้อมูล passwd (5) ในขณะที่ใช่มาตรฐาน filesytem.org จะวางผู้ใช้ปกติใน / home ซึ่งไม่ใช่กรณีของผู้ใช้ทุกคน (เช่น root ใน / root และบริการใน / var / ... หรือ unixies รุ่นเก่าโดยใช้ / usr แทน / home)
Dwight Spencer

DwightSpencer ถูกต้อง ฉันบำรุงรักษาเซิร์ฟเวอร์หลายเครื่องที่ผู้ใช้อยู่ใน / usr / {CLIENTNAME} / home / และใช้ร่วมกันผ่านระบบ inhouse และระบบระยะไกลหลายระบบ (ชี้ไปที่ไดเรกทอรีนั้น) ดังนั้นจึงจำเป็นต้องบำรุงรักษาเพียง 1 ระบบ และ ~ ชี้ไปที่ไดเรกทอรีนั้น)
Rinzwind

3
@ Rinzwind eek /usrผมต้องประท้วงในทางที่ผิดซึ่งล่วงเกินสิ่งศักดิ์สิทธิ์นี้
muru

@muru เฮ้มันไม่ใช่การโทรของฉัน>: - D มันเป็นสิ่งที่เหลือจาก SCO D:
Rinzwind

1
สุจริตฉันชอบการใช้ / usr สำหรับผู้ใช้ทุกสิ่งเพราะนั่นคือสิ่งที่มันหมายถึงเดิม สิ่งที่ฉันพบในทุกวันนี้คือการใช้ / usr / bin ที่ใช้ในทางที่ผิดมากขึ้นในฐานะที่เป็นพื้นที่ทิ้งขยะแบบรวมศูนย์ของไบนารีทั้งหมด (sys, ผู้ใช้, sysop) นอก binutils ฐาน หลังจาก / usr ทั้งหมดมีความหมายเนื่องจากทุกสิ่งที่ผู้ใช้สามารถเข้าถึงเพื่อดึงจากการเมาท์ nfs ในขณะที่ / usr / local เป็นพื้นที่ผู้ใช้ท้องถิ่นที่มี / sbin เป็นไบนารี sysop และไบนารีระบบ / bin ฉันได้รับ / home สามารถเป็นพาร์ติชันที่แตกต่างกัน แต่สามารถ / usr / home / ... เก็บไว้ใน / usr ทำให้มันเป็นผู้ใช้ namespace ทั้งในนโยบายการดำเนินงานและความคิด
Dwight Spencer

3

~เป็นชวเลขสำหรับตัวแปรสภาพแวดล้อม$HOMEบนเชลล์ c ส่วนใหญ่ / รองรับเชลล์ที่สอดคล้องกับ POSIX การใช้งานที่พบบ่อยที่สุด~คือเมื่ออ้างถึงโฮมไดเร็กตอรี่ของคุณหรือของโฮมของผู้ใช้อื่น:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

ในการค้นหาโฮมไดเร็กทอรีสำหรับผู้ใช้โลคัลบนระบบ POSIX (UNIX, Linux, OS X, BSD) ที่ใช้ฐานข้อมูลpasswd (5) ที่รัน awk อยู่/etc/passwdเช่นนั้น:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

นี่จะแสดงรายการผู้ใช้ท้องถิ่นและไดเรกทอรีภายในบ้านของพวกเขา

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