Что делает команда «sudo mv home/* *»?

Я предпочитаю этот скрипт, который использует 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

0
22.05.2018, 16:37
3 ответа

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 *.

0
28.01.2020, 02:18

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), исправили это, отменив команду, если какой-либо из глобусов не совпадает.

3
28.01.2020, 02:18

Все зависит от того, во что расширяются шаблоны подстановки оболочки.

Он выполняет одно из трех действий:

  1. Если *в конце команды расширяется до списка имен, а последним элементом в этом списке является имя каталога , тогда команда перемещает все, что home/*расширяется до, и все, что *расширяется до (, но не это последнее имя каталога )в этот каталог. Файлы и каталоги, соответствующие home/*, будут найдены рядом с каталогом homeв целевом каталоге, если home/*заменяется чем-либо и если целевой каталог еще не содержит каталог home.

  2. Если *в конце команды расширяется до списка имен, а последний элемент в этом списке является именем чего-то, что не является каталогом, то команда выдаст ошибка.

  3. Если *вообще не расширяется (из-за того, что текущий каталог пуст ), будет выдана ошибка.

Если используется mvиз GNU coreutils и последний *соответствует одному или нескольким именам, начинающимся с тире,это может изменить то, что делает команда, в зависимости от того, как опции mvинтерпретируют имя.

1
28.01.2020, 02:18

Теги

Похожие вопросы