Я предпочитаю этот скрипт, который использует ssh -add, чтобы узнать, были ли уже добавлены ваши ключи
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
test -r ~/.ssh-agent && \
eval "$(<~/.ssh-agent)" >/dev/null
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
(umask 066; ssh-agent > ~/.ssh-agent)
eval "$(<~/.ssh-agent)" >/dev/null
ssh-add
fi
fi
Подробнее об этом можно прочитать на:http://rabexc.org/posts/pitfalls-of-ssh-agents
Cuando ejecuté esto yo mismo, terminó creando una carpeta llamada *
en mi carpeta de destino, y también eliminó los archivos de origen de los que estaba tomando. Después de algunas pruebas más, se devolvió el comportamiento esperado de '*
no es un directorio' y no se creó un nuevo directorio llamado *
.
Creo que está más en línea con la pregunta que se hace, ya que indica que sus archivos desaparecieron y echo *
devuelve *
.
home/*
и *
являются глобусами оболочки, они сначала расширяются оболочкой (, поэтому здесь вы работаете как вы, а не с привилегиями суперпользователя ), и результирующие слова , затем передаются в качестве аргумента к команде.
Итак, если home
содержит .
, ..
, .hidden
. u1
, u2
и текущий каталог содержит .
, ..
, .hidden
, -i
, x
, y
, аргументы, которые получит mv
, будут mv
, home/u1
, home/u2
, -i
, x
, y
.
В некоторых реализациях mv
, таких как GNU mv
, есть ошибка, заключающаяся в том, что аргументы, начинающиеся с -
, по-прежнему распознаются как параметры, даже если они встречаются после не -аргументов параметров, поэтому выше, что -i
, будет принято как вариант -i
дляmv
(sudo
по понятным причинам не имеет этого недостатка ).
y
будет взят mv
в качестве целевого каталога, и именно туда файлы исчезнут, если y
имеет тип каталог (или символическую ссылку на каталог ).
mv
не увидит аргумент *
или home/*
(, если, конечно, там нет файлов с такими именами ). Однако обратите внимание, что некоторые оболочки, такие как большинство подобных Bourne -, имеют такую неправильную функцию, что если glob не соответствует ни одному файлу, он передается команде как (нерасширенный ).
Таким образом, если текущий каталог содержит только скрытые файлы, то mv
получит *
в качестве последнего аргумента. mv
не обрабатывает *
специально (роль оболочки заключается в понимании глобусов ), поэтому будет обрабатывать его как буквальное имя целевого каталога. Теперь, если нет скрытого файла, отличного от -, этот каталог *
также не будет существовать, поэтому mv home/u1 home/u2 *
просто сообщит об ошибке о том, что целевой каталог не существует. Однако, если бы в home
было только u1
, mv home/u1 *
заставило бы mv
переименовать home/u1
в *
в текущем каталоге.
Эта ошибка была введена оболочкой Bourne в 1979 году.В более ранних версиях Unix (и в csh, который не изменил его ), команда отменяется, если ни один из глобусов не совпадает. Затем globs были расширены помощником /etc/glob
(, который дал имя globs ). Однако, если хотя бы один глобус соответствовал какому-либо файлу, не соответствующие -глобусы удалялись. Таким образом, в csh/tcsh (илиzsh -o cshnullglob
)mv home/* *
, где в текущем каталоге нет скрытого файла, отличного от -, станет mv home/u1 home/u2
, который переместит u1
в u2
.
Современные оболочки, такие как zsh
,fish
(или bash -o failglob
), исправили это, отменив команду, если какой-либо из глобусов не совпадает.
Все зависит от того, во что расширяются шаблоны подстановки оболочки.
Он выполняет одно из трех действий:
Если *
в конце команды расширяется до списка имен, а последним элементом в этом списке является имя каталога , тогда команда перемещает все, что home/*
расширяется до, и все, что *
расширяется до (, но не это последнее имя каталога )в этот каталог. Файлы и каталоги, соответствующие home/*
, будут найдены рядом с каталогом home
в целевом каталоге, если home/*
заменяется чем-либо и если целевой каталог еще не содержит каталог home
.
Если *
в конце команды расширяется до списка имен, а последний элемент в этом списке является именем чего-то, что не является каталогом, то команда выдаст ошибка.
Если *
вообще не расширяется (из-за того, что текущий каталог пуст ), будет выдана ошибка.
Если используется mv
из GNU coreutils и последний *
соответствует одному или нескольким именам, начинающимся с тире,это может изменить то, что делает команда, в зависимости от того, как опции mv
интерпретируют имя.