Tylda (~) w działającym katalogu unix

22

Tak więc, pracuję w środowisku UNIX i zauważyłem, że w moim katalogu roboczym, który jest mile od mojego domu w UNIX, jest ~.

Teraz, kiedyś, zrobiłem to rm -rf ~z mojego katalogu roboczego i ostatecznie skasowałem mój katalog domowy i musiałem zaangażować IT.

Nie chcę tego robić ponownie. Jednocześnie chcę wiedzieć

  1. Dlaczego jest ~tworzony w moim katalogu roboczym? Czy to jest wadliwy poślizg palca podczas zapisywania ( :w!ale co się dzieje :w~? !!)

  2. Przed zalogowaniem istnieje skrypt, który wyszukuje dodatkowe pliki lub foldery, których p4 nie zna, więc ~może to spowodować problem. Więc jak mogę usunąć ~z mojego katalogu roboczego i jednocześnie nie kasować mojego domu?

Mam polecenie tworzenia kopii zapasowej o nazwie del, którego używam zamiast rm -rf. Po prostu umieszcza rzeczy w tymczasowej lokalizacji. Mógłbym to wykorzystać i pozbyć się ~. Ale bardziej interesuje mnie, dlaczego tak się dzieje i jak mogę to usunąć?

użytkownik73631
źródło
Zwykle powłoka zastępuje ~ na początku ścieżki katalogiem domowym. Użyj pełnej ścieżki, /home/yourUserName/~aby uzyskać dostęp do katalogu o nazwie ~.
jofel
I ~ inny użytkownik / plik może służyć do odwoływania się do katalogów domowych innych użytkowników, dla zachowania kompletności.
godlygeek
Wygląda jak dowcip!
Xolve

Odpowiedzi:

36

Albo to zacytuj:

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

Lub odwołaj się do niego ścieżką, a nie tylko nazwą basename:

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

Należy zauważyć, że pomimo bycia zabawnym wyglądzie pojedyncza nazwa postaci, to nie różni się koncepcyjnie niż gdybyś utworzony plik o nazwie SOME$PATHwykonując

touch 'SOME$PATH'

I próbował go usunąć, wykonując:

rm -i SOME$PATH

( Ostrzeżenie: zmienna SOME$PATH nie jest cytowana na potrzeby przykładu. Zwykle byłaby ujęta w cudzysłów 'SOME$PATH' )

W obu przypadkach powłoka rozwija nazwę, którą nadajesz, i musisz temu zapobiec.

Ponadto: nie używaj rm -rfdo usuwania pliku! Głównym celem rm -rjest poinformowanie, rmże usunięcie katalogów jest w porządku. Jeśli nie chcesz przypadkowo usunąć całych katalogów podczas próby usunięcia plików, zwykle nie przechodź -r!

godlygeek
źródło
12
Właśnie to przetestowałem. :w~w vim stworzył plik o nazwie ~. rm ~powrócił cannot remove /home/seth it is a directory. rm "~"usunął plik . Aby podkreślić , nie przechodź -rfautomatycznie .
Seth
4
+1 za zalecenie domyślnego pominięcia gwałtownych opcji. Jest to podobne do kill -9domyślnego działania, które widziałem.
Celada
Widzę, że przykład rm -i $FOOcelowo nie przytacza zmiennej dla samego przykładu, ale nadal: pokazując przykład powłoki obejmujący rmi niecytowaną zmienną jako argument jest BARDZO ZŁY , uh, przepraszam, niezależny od kontekstu. Jestem pewien, że można to udowodnić :) Dodam notatkę - ale może mógłbyś trochę zmienić przykład?
Volker Siegel
@VolkerSiegel, Punkt zajęty - wziąłem udział w twojej edycji, ale przypis wydawał mi się zbyt ciężki. Zmieniłem też nazwę zmiennej, która jeszcze mniej może powodować problemy - większość ludzi nie ma pliku o nazwie SOME/bin:/usr/binnigdzie w swoim systemie plików. :)
godlygeek
Tak, wygląda dobrze! (Już prawie miałem odpowiedzieć: Co? Ciężko pracujący? Czy kiedykolwiek doświadczyłeś prawdziwego problemu z cytowaniem w swoim życiu?;) Po prostu trochę rozpaczliwie na temat liczby złych przykładów skorupy, ogólnie ... Hej, to trudne zrozumieć nawet bez złych przykładów! )
Volker Siegel
1

Tylda, gdy zostanie użyta sama w kontekście ls ~, wyświetli twój domowy katalog jako ~ jest skrótem do twojego domowego katalogu. Jeśli to zrobiłeś ls ~brown, wyświetlisz zawartość domowego katalogu reż. Browna.

VIM, o ile nie powiedziano inaczej, utworzy kopię zapasową zmienionego pliku: myFile myFile ~.

To zachowanie jest dobre, ponieważ tworzy kopię zapasową, ale jeśli nie chcesz, dodaj do siebie plik .vimrc: nie ustawiaj kopii zapasowej (do której właśnie uzyskałem dostęp vi ~/.vimrc).

I oczywiście, jak powiedzieli inni, jeśli masz plik o nazwie ~, po prostu użyj znaku char jako \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this
użytkownik2592248
źródło
0

Może to być spowodowane błędami. Jeśli twoja TERM=xtermkonfiguracja jest podobna do mojej, to praktycznie każdy klawisz funkcyjny na klawiaturze wyśle ​​sekwencje specjalne, takie jak ...

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

Ponad połowa danych wyjściowych infocmp -1zawiera ~znaki ucieczki tyldy na moim komputerze - i nie mogę zrozumieć, co robi większość z nich. Wiem, że zshprzynajmniej faktycznie zjada uciekającą część sznurka w większości przypadków - i pozostawia tylko ~tyldę .

Na przykład pisanie echowtedy , a <space>potem F6i <return>drukowanie ...

/home/mikeserv

Rzeczywista wysłana sekwencja ucieczki to ...

kf6=\E[17~

Co ciekawe, istnieją inne sekwencje specjalne, które zawierają >postacie.

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

Są to często używane sekwencje specjalne - ciągi resetowania i inicjowania. Nietrudno wyobrazić sobie, że upuszczenie klawiatury lub roztrzaskanie przycisków w oczekiwaniu na wejście interaktywnej powłoki może spowodować przypadkowe obcięcie ~plików w całym systemie plików. Przynajmniej czasami pojawia się u mnie.

mikeserv
źródło