Тильда (~) внутри рабочего каталога unix

Тильда (~) внутри рабочего каталога unix

Я работаю в среде UNIX и заметил, что внутри моего рабочего каталога, который находится за много миль от моего домашнего каталога UNIX, есть файл ~.

Однажды в прошлом я сделал это rm -rf ~из своего рабочего каталога и в итоге полностью удалил свой домашний каталог, и мне пришлось обратиться в ИТ-отдел.

Я не хочу делать это снова. В то же время я хочу знать:

  1. Почему ~создается в моем рабочем каталоге? Это ошибка пальца при сохранении ( :w!но что происходит :w~?!!)

  2. Перед регистрацией есть скрипт, который ищет дополнительные файлы или папки, о которых 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>,

Это часто используемые экранирования — строки сброса и инициализации. Нетрудно представить, что падение клавиатуры или нажатие какой-либо кнопки, когда интерактивная оболочка ожидает ввода, может привести к случайному усечению ~файлов по всей вашей файловой системе. По крайней мере, это иногда случается в моей.

Связанный контент