Tilde (~) bên trong thư mục unix làm việc


22

Vì vậy, Im làm việc trong một môi trường UNIX và tôi nhận thấy rằng bên trong thư mục làm việc của tôi, đó là dặm dặm từ nhà UNIX của tôi, có một ~.

Bây giờ, một lần trong quá khứ, tôi đã làm rm -rf ~từ thư mục làm việc của mình và cuối cùng đã xóa hoàn toàn thư mục nhà của tôi và phải liên quan đến CNTT.

Tôi không muốn làm lại. Đồng thời, tôi muốn biết

  1. Tại sao được ~tạo trong thư mục làm việc của tôi? Đây có phải là một ngón tay bị lỗi trong khi lưu ( :w!nhưng điều gì xảy ra :w~? !!)

  2. Trước khi đăng ký, có một tập lệnh tìm kiếm các tệp hoặc thư mục bổ sung mà p4 không biết vì vậy def này ~có thể gây ra sự cố. Vì vậy, làm thế nào tôi có thể loại bỏ ~khỏi thư mục làm việc của tôi và đồng thời không xóa nhà của tôi?

Tôi có một lệnh sao lưu được gọi là deltôi sử dụng thay vì rm -rf. Nó chỉ đặt công cụ ở một vị trí tạm thời. Tôi có thể sử dụng nó và thoát khỏi ~. Nhưng tôi quan tâm hơn đến việc tại sao điều này xảy ra, và làm thế nào tôi có thể loại bỏ nó?


Thông thường, shell thay thế ~ ở đầu một đường dẫn với thư mục chính của bạn. Sử dụng đường dẫn đầy đủ /home/yourUserName/~để truy cập vào thư mục được gọi ~.
jofel

Và ~ otheruser / file có thể được sử dụng để tham chiếu các thư mục nhà của người dùng khác, vì mục đích hoàn chỉnh.
trời ơi

Trông như một trò đùa!
Xolve

Câu trả lời:


36

Hoặc là trích dẫn nó:

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

Hoặc tham chiếu nó bằng một đường dẫn, thay vì chỉ một tên cơ sở:

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

Lưu ý rằng, mặc dù là một tên nhân vật trông có vẻ buồn cười, nhưng về mặt khái niệm này không khác gì so với việc bạn đã tạo một tệp có tên SOME$PATHbằng cách thực hiện

touch 'SOME$PATH'

Và đã cố gắng loại bỏ nó bằng cách làm:

rm -i SOME$PATH

( Cảnh báo: biến SOME$PATH không được trích dẫn vì lợi ích của ví dụ ở đây. Thông thường, nó sẽ được đặt trong dấu ngoặc kép 'SOME$PATH' )

Trong cả hai trường hợp, shell đang mở rộng tên bạn đưa ra và bạn cần ngăn chặn điều đó.

Ngoài ra: Không sử dụng rm -rfđể xóa một tập tin! Toàn bộ mục đích rm -rlà để nói rằng rmnó ổn để loại bỏ các thư mục. Nếu bạn không muốn vô tình xóa toàn bộ thư mục trong khi cố gắng xóa tệp, đừng bỏ qua thói quen-r !


12
Tôi chỉ thử nghiệm điều này. :w~trong vim đã tạo một tập tin gọi là ~. rm ~trở về cannot remove /home/seth it is a directory. rm "~"đã loại bỏ các tập tin . Chỉ cần gạch chân không vượt qua -rftự động .
Seth

4
+1 để đề xuất bỏ qua các tùy chọn bạo lực theo mặc định. Điều này giống như làm kill -9theo mặc định, mà tôi đã thấy.
Celada

Tôi thấy rằng ví dụ này rm -i $FOOcố ý không trích dẫn biến vì lợi ích của ví dụ, nhưng vẫn: hiển thị một ví dụ shell liên quan rmvà một biến không được trích dẫn làm đối số là RẤT BAD , uh, xin lỗi, không phụ thuộc vào ngữ cảnh. Tôi chắc chắn rằng thậm chí có thể được cung cấp :) Tôi sẽ thêm một số lưu ý - nhưng có lẽ bạn có thể thay đổi ví dụ một chút không?
Volker Siegel

@VolkerSiegel, Điểm đã thực hiện - Tôi đã tham gia chỉnh sửa của bạn, nhưng chú thích có vẻ hơi quá nặng tay. Tôi cũng đã chuyển sang một tên biến thậm chí ít có khả năng gây ra sự cố - hầu hết mọi người không có tệp có tên ở SOME/bin:/usr/binbất kỳ đâu trên hệ thống tệp của họ. :)
trời ơi

Vâng, có vẻ tốt! (Tôi gần như sẽ trả lời: Cái gì? Nặng tay? Bạn đã bao giờ gặp phải một vấn đề trích dẫn thực sự trong cuộc sống của mình chưa ?;) Chỉ hơi khác biệt về số lượng ví dụ vỏ sai ngoài kia, nói chung ... Này, thật khó để hiểu ngay cả khi không có ví dụ sai! )
Volker Siegel

1

Dấu ngã khi được sử dụng một mình trong ngữ cảnh ls ~sẽ liệt kê thư mục nhà của bạn vì ~ là một lối tắt đến thư mục nhà của bạn. Nếu bạn đã làm ls ~brownthì bạn sẽ liệt kê các nội dung của dir nhà màu nâu.

VIM, trừ khi được nói khác, sẽ tạo một bản sao lưu của tệp đã thay đổi: myFile myFile ~.

Hành vi này là tốt vì nó tạo ra một bản sao lưu nhưng nếu bạn không muốn, hãy thêm vào tệp .vimrc của bạn: không đặt bản sao lưu (mà tôi vừa truy cập vi ~/.vimrc ).

Và tất nhiên như những người khác đã nói, nếu bạn có một tệp được gọi là ~ thì chỉ cần thoát char là \ ~

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

0

Điều này có thể được thực hiện bởi sương mù. Nếu TERM=xtermcấu hình của bạn là bất cứ thứ gì giống như của tôi, thì thực tế mọi phím chức năng trên bàn phím của bạn sẽ gửi các chuỗi thoát như ...

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

Hơn một nửa sản lượng infocmp -1chứa ~dấu ngã thoát trên máy của tôi - và tôi không thể hiểu được phần lớn chúng làm gì. Tôi biết rằng zshít nhất thực sự ăn phần thoát của chuỗi trong hầu hết các trường hợp - và chỉ để lại ~dấu ngã .

Ví dụ, gõ echosau đó <space>sau đó F6<return>in ...

/home/mikeserv

Trình tự thoát thực tế được gửi là ...

kf6=\E[17~

Thật thú vị, có những chuỗi thoát khác chứa các >ký tự.

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>,

Đó là những lối thoát thường được sử dụng - thiết lập lại và chuỗi khởi tạo. Không khó để tưởng tượng rằng một bàn phím bị rơi hoặc đập vỡ một loại nào đó khi một vỏ tương tác đang chờ đầu vào có thể dẫn đến ~các tệp bị cắt ngẫu nhiên xảy ra trong toàn bộ hệ thống tệp của bạn. Ít nhất, nó thỉnh thoảng mọc lên trên mỏ của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.