Tilde (~) ภายในไดเร็กทอรี unix ที่ทำงาน


22

ดังนั้น Im ทำงานในสภาพแวดล้อม UNIX และผมสังเกตเห็นว่าภายในไดเรกทอรีการทำงานของฉันซึ่งเป็นไมล์ห่างออกไปจากบ้านของฉัน UNIX ~มี

ตอนนี้ครั้งหนึ่งที่ผ่านมาฉันทำrm -rf ~จากไดเรกทอรีการทำงานของฉันและจบลงด้วยการลบไดเรกทอรีบ้านของฉันอย่างสมบูรณ์และต้องเกี่ยวข้องกับไอที

ฉันไม่ต้องการที่จะทำมันอีกครั้ง ในขณะเดียวกันฉันก็อยากจะรู้

  1. เหตุใดจึง~สร้างในไดเรกทอรีทำงานของฉัน มันลื่นนิ้วผิดพลาดในขณะที่บันทึก ( :w!แต่จะเกิดอะไรขึ้น:w~? !!)

  2. ก่อนที่จะเช็คอินมีสคริปต์ที่ค้นหาไฟล์หรือโฟลเดอร์เพิ่มเติมที่ p4 ไม่ได้รับทราบดังนั้นการกำหนดนี้~อาจทำให้เกิดปัญหา ดังนั้นฉันจะลบออก~จากไดเรกทอรีการทำงานของฉันและในเวลาเดียวกันไม่ได้ลบบ้านของฉันได้อย่างไร

ฉันจะมีคำสั่งสำรองข้อมูลที่เรียกว่าที่ผมใช้แทนdel rm -rfมันเป็นเพียงแค่วางสิ่งของในสถานที่ชั่วคราว ~ฉันสามารถใช้และได้รับการกำจัดของ แต่ฉันสนใจที่จะรู้ว่าทำไมจึงเกิดเหตุการณ์นี้ขึ้นและฉันจะลบออกได้อย่างไร


โดยปกติแล้วเชลล์จะแทนที่ ~ ที่ตำแหน่งเริ่มต้นของพา ธ ด้วยโฮมไดเร็กตอรี่ของคุณ ใช้เส้นทางแบบเต็มในการเข้าถึงไดเรกทอรีที่เรียกว่า/home/yourUserName/~ ~
กรกฎาคม

และ ~ otheruser / file สามารถใช้เพื่ออ้างอิงโฮมไดเร็กตอรี่ของผู้ใช้คนอื่น, เพื่อความสมบูรณ์.
godlygeek

ดูเหมือนเล่นตลก!
Xolve

คำตอบ:


36

ทั้งอ้างมัน:

rm -i '~'
rm -i "~"
rm -i \~

หรืออ้างอิงโดยพา ธ แทนที่จะเป็นเพียงชื่อฐาน:

rm -i ./~
rm -i /path/to/~

โปรดทราบว่าแม้จะเป็นชื่อตัวละครที่ดูตลก แต่แนวคิดนี้ก็ไม่ต่างไปจากการที่คุณสร้างไฟล์SOME$PATHโดยการทำ

touch 'SOME$PATH'

และพยายามที่จะลบออกโดยทำ:

rm -i SOME$PATH

( คำเตือน: ตัวแปร SOME$PATH จะไม่ยกมาเพื่อประโยชน์ของตัวอย่างที่นี่โดยปกติมันจะอยู่ในเครื่องหมายคำพูด 'SOME$PATH' )

ในทั้งสองกรณีเชลล์กำลังขยายชื่อที่คุณให้ไว้และคุณต้องป้องกันมัน

นอกจากนี้: อย่าใช้rm -rfเพื่อลบไฟล์! จุดประสงค์ทั้งหมดrm -rคือการบอกrmว่าตกลงเพื่อลบไดเรกทอรี หากคุณไม่ต้องการลบไดเรกทอรีทั้งหมดในขณะที่พยายามลบไฟล์อย่าผ่านไปโดยไม่ตั้งใจ-r!


12
ฉันเพิ่งทดสอบสิ่งนี้ ในกลุ่มได้สร้างไฟล์ที่เรียกว่า:w~ กลับ ไม่ลบไฟล์ เพียงเพื่อขีดเส้นใต้ไม่ผ่านโดยอัตโนมัติ ~rm ~cannot remove /home/seth it is a directoryrm "~"-rf
เซ.

4
+1 สำหรับการแนะนำให้ละเว้นตัวเลือกที่มีความรุนแรงตามค่าเริ่มต้น นี่เป็นสิ่งที่คล้ายกับการทำkill -9ตามค่าเริ่มต้นซึ่งฉันได้เห็น
Celada

ฉันเห็นว่าตัวอย่างrm -i $FOOจงใจไม่ได้อ้างอิงตัวแปรเพื่อประโยชน์ของตัวอย่าง แต่ยัง: แสดงตัวอย่างเชลล์ที่เกี่ยวข้องrmและตัวแปร unquoted เป็นอาร์กิวเมนต์เป็นVAD BAD , เอ่อขอโทษอิสระจากบริบท ฉันแน่ใจว่าอาจเป็นข้อตกลงได้ :) ฉันจะเพิ่มบันทึกย่อ - แต่บางทีคุณอาจเปลี่ยนตัวอย่างเล็กน้อยได้หรือไม่
Volker Siegel

@VolkerSiegel, จับจุด - ฉันเข้าร่วมการแก้ไขของคุณแล้ว แต่เชิงอรรถดูเหมือนว่าจะหนักไปหน่อย ฉันยังเปลี่ยนไปใช้ชื่อตัวแปรแม้แต่โอกาสน้อยที่จะทำให้เกิดปัญหา - คนส่วนใหญ่ไม่มีไฟล์ชื่อSOME/bin:/usr/binใด ๆ ในระบบไฟล์ของพวกเขา :)
godlygeek

ใช่ดูดี! (ฉันเกือบจะตอบว่า: อะไรมือหนัก ๆ คุณเคยเจอปัญหาการอ้างอิงจริงในชีวิตของคุณหรือเปล่า?) แค่ดูตัวอย่างเปลือกหอยที่ผิดปกติโดยทั่วไป ... เฮ้มันยาก เข้าใจแม้ไม่มีตัวอย่างผิด! )
Volker Siegel

1

ตัวหนอนเมื่อใช้เพียงอย่างเดียวในบริบทของls ~จะแสดงรายการ dir บ้านของคุณเป็น ~ เป็นทางลัดไปยัง dir บ้านของคุณ ถ้าคุณทำls ~brownแล้วคุณจะแสดงรายการเนื้อหาของ dir บ้านสีน้ำตาล

VIM นอกจากจะมีการแจ้งเป็นอย่างอื่นจะสร้างสำเนาสำรองของไฟล์ที่เปลี่ยนแปลง: myFile myFile ~

ลักษณะการทำงานนี้ดีเพราะสร้างการสำรองข้อมูล แต่ถ้าคุณไม่ต้องการให้เพิ่มไฟล์. vimrc ให้กับคุณ: ตั้งค่าการสำรองข้อมูล (ซึ่งฉันเพิ่งเข้าถึงด้วยvi ~/.vimrc)

และแน่นอนอย่างที่คนอื่นพูดถ้าคุณมีไฟล์ที่เรียกว่า ~ ก็ให้หลบหนี char เป็น \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

สิ่งนี้อาจได้รับผลกระทบจากการพิมพ์ผิด หากการกำหนดค่าของคุณTERM=xtermเป็นของฉันเหมือนจริงทุกปุ่มฟังก์ชั่นบนแป้นพิมพ์ของคุณจะส่งลำดับการหลบหนีเช่น ...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

มากกว่าครึ่งของการส่งออกของinfocmp -1มี~เครื่องหมายตัวหนอนบนเครื่องของฉัน - และฉันสูญเสียที่จะเข้าใจสิ่งที่พวกเขาส่วนใหญ่ทำ ฉันจะรู้ว่าzshอย่างน้อยจริงกินส่วนหนีของสตริงในกรณีส่วนใหญ่ - และใบเพียงตัวหนอน~

ตัวอย่างเช่นการพิมพ์echoแล้ว<space>แล้วF6และ<return>พิมพ์ ...

/home/mikeserv

ลำดับการหลบหนีที่แท้จริงที่ส่งคือ ...

kf6=\E[17~

ที่น่าสนใจมีลำดับหนีอื่น ๆ เหล่านี้ซึ่งมี>อักขระ

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

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

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