%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B5%D0%B3%D0%BE%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20unix.png)
Я работаю в среде UNIX и заметил, что внутри моего рабочего каталога, который находится за много миль от моего домашнего каталога UNIX, есть файл ~
.
Однажды в прошлом я сделал это rm -rf ~
из своего рабочего каталога и в итоге полностью удалил свой домашний каталог, и мне пришлось обратиться в ИТ-отдел.
Я не хочу делать это снова. В то же время я хочу знать:
Почему
~
создается в моем рабочем каталоге? Это ошибка пальца при сохранении (:w!
но что происходит:w~
?!!)Перед регистрацией есть скрипт, который ищет дополнительные файлы или папки, о которых p4 не знает, поэтому это
~
может вызвать проблему. Как мне удалить~
из моего рабочего каталога и в то же время не стереть мой домашний?
У меня есть команда резервного копирования, которая называется , del
которую я использую вместо rm -rf
. Она просто помещает вещи во временное расположение. Я мог бы использовать ее и избавиться от ~
, но мне больше интересно узнать, почему это происходит, и как я могу это удалить.
решение1
Либо процитируйте это:
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
!
решение2
Тильда, используемая отдельно в контексте, ls ~
перечислит ваш домашний каталог, так как ~ — это ярлык для вашего домашнего каталога. Если вы это сделали, ls ~brown
то вы перечислите содержимое домашнего каталога Brown.
VIM, если не указано иное, создаст резервную копию измененного файла: myFile myFile~.
Такое поведение хорошо, так как оно создает резервную копию, но если вам это не нужно, добавьте в свой файл .vimrc: set no backup (к которому я только что получил доступ с помощью vi ~/.vimrc
).
И, конечно, как уже говорили другие, если у вас есть файл с именем ~, то просто экранируйте символ как \~
me 217 % vi this (saved as :w~)
me 218 % ls
this ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this
решение3
Это может быть вызвано опечатками. Если ваша TERM=xterm
конфигурация похожа на мою, то практически каждая функциональная клавиша на вашей клавиатуре будет отправлять escape-последовательности, например...
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>,
Это часто используемые экранирования — строки сброса и инициализации. Нетрудно представить, что падение клавиатуры или нажатие какой-либо кнопки, когда интерактивная оболочка ожидает ввода, может привести к случайному усечению ~
файлов по всей вашей файловой системе. По крайней мере, это иногда случается в моей.