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

22

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

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

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

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

  2. Перед регистрацией есть скрипт, который ищет дополнительные файлы или папки, которые p4 не знает, поэтому def ~может вызвать проблему. Так, как я могу удалить ~из своего рабочего каталога и в то же время не стирать мой дом?

У меня есть команда резервного копирования, delкоторую я использую вместо rm -rf. Он просто помещает вещи во временное местоположение. Я мог бы использовать это и избавиться от ~. Но мне больше интересно знать, почему это происходит, и как я могу это убрать?

user73631
источник
Обычно оболочка заменяет ~ в начале пути на ваш домашний каталог. Используйте полный путь /home/yourUserName/~для доступа к каталогу с именем ~.
Джофель
И ~ otheruser / file может использоваться для ссылки на домашние каталоги других пользователей для полноты картины.
Godlygeek
Похоже на шутку!
Ксольв

Ответы:

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!

godlygeek
источник
12
Я только что проверил это. :w~в vim действительно создал файл с именем ~. rm ~вернулся cannot remove /home/seth it is a directory. rm "~"действительно удалил файл . Просто чтобы подчеркнуть , не проходят -rfавтоматически .
Сет
4
+1 за рекомендацию по умолчанию опускать насильственные варианты. Это похоже на выполнение kill -9по умолчанию, которое я видел.
Селада
Я вижу, что пример rm -i $FOOнамеренно не заключает в кавычки переменную ради примера, но все же: показывать пример оболочки с rmвключенной переменной без кавычек в качестве аргумента ОЧЕНЬ ПЛОХО , ну, извините, независимо от контекста. Я уверен, что это может быть даже доказано :) Я добавлю некоторые примечания - но, может быть, вы могли бы немного изменить пример?
Фолькер Сигел
@VolkerSiegel, Точка занята - я принял участие в вашем редактировании, но сноска казалась слишком тяжелой. Я также переключился на имя переменной, которая еще реже вызывает проблемы - у большинства людей нет файлов с именами SOME/bin:/usr/binв их файловой системе. :)
godlygeek
Да, выглядит хорошо! (Я почти собирался ответить: «Что? Неуклюжие руки? Вы когда-нибудь сталкивались с реальной проблемой цитирования в своей жизни?») Просто несколько отрывался от количества неправильных примеров оболочки, в общем ... Эй, это сложно понять даже без неверных примеров! )
Фолькер Сигел
1

Тильда, если она используется отдельно в контексте, ls ~будет указывать ваш домашний каталог как ~ ярлык для вашего домашнего каталога. Если вы это сделали, ls ~brownто перечислите содержимое домашнего каталога Брауна.

VIM, если не указано иное, создаст резервную копию измененного файла: myFile myFile ~.

Это хорошо, так как создает резервную копию, но если вы не хотите ее добавлять, добавьте к вам файл .vimrc: не устанавливайте резервную копию (к которой я только что обратился vi ~/.vimrc).

И, конечно, как говорили другие, если у вас есть файл с именем ~, тогда просто экранируйте символ как \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this
user2592248
источник
0

Это может быть вызвано опечатками. Если ваша 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

Фактически отправленная escape-последовательность ...

kf6=\E[17~

Интересно, что есть другие из этих escape-последовательностей, которые содержат >символы.

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-коды - строки сброса и инициализации. Нетрудно представить, что упавшая клавиатура или какое-либо нажатие кнопки, когда интерактивная оболочка ожидает ввода, может привести к случайному усечению ~файлов, встречающихся в вашей файловой системе. По крайней мере, это иногда появляется на моем.

mikeserv
источник