15

Кто имеет дело (интерпретирует) * в

echo *

Эхо видит звезду или оболочка заботится об этом и возвращает список имен файлов ...

Как насчет

cp temp temp*

4 ответа4

24

bash (или то, что вы используете в качестве оболочки)- это первое, что читает любой ввод, и начнет интерпретировать специальные символы, такие как ? и * . * расширяется до любых совпадений в CWD, что означает, что звездочка заменяется указанными совпадениями.

В большинстве случаев это довольно прямолинейно, но может время от времени приводить к некоторым запутанным случаям.

Учтите следующее. Каталог имеет это содержимое:

  • тест (обычный файл)
  • test1 (каталог)
  • test2 (каталог)
  • test3 (каталог)

Если вы затем mv * произойдет что-то странное: test3 уже есть, а остальное пропало. Поначалу это странно, но имеет смысл, когда вы поймете, что bash на самом деле передает mv . Из-за звездочки bash интерпретирует mv * как mv test test1 test2 test3 , и когда mv получит этот список, он будет предполагать, что последним аргументом является пункт назначения, куда все файлы были бы перемещены.

Что касается команд, которые вы перечислили:

  • echo * может функционировать как бедняк ls . Оболочка расширит звёздочку до того, что находится в этом каталоге, и, как я уверен, вы уже знаете, echo будет буквально отображать все, что bash передал в качестве аргументов.
  • cp temp temp* будет вести себя примерно так же, как команда mv я описал выше, за исключением случаев, когда существует только один каталог с именем temp, в этом случае имя источника и назначения совпадают, то есть ничего не будет сделано.
5

Как уже говорилось, оболочка расширяется * поэтому echo получает в качестве аргументов то, что оболочка находит в текущем каталоге. Однако обратите внимание, что если расширение ни к чему не приводит, т. Е. В том случае, если каталог не содержит не скрытых файлов, * остается неизменным и передается как есть вызываемой команде (если нестандартные параметры не используются с некоторыми оболочками, такими как bash .) тогда echo * не будет вести себя как ls бедного человека, так как первый ничего не напечатает, а второй напечатает * .

Аналогично, cp /tmp/temp temp* создаст файл с именем temp* в текущем каталоге, если еще нет хотя бы одного файла, имя которого начинается с temp .

Наконец, если вы хотите, чтобы * передавался без изменений в любом случае, вы можете защитить его от раскрытия, используя одинарные кавычки '*' , двойные кавычки "*" или обратную косую черту \* .

4

В Bash оболочка имеет с этим дело. Вы видите, что если вы даже попытаетесь * без эха

Примечание. Исходя из некоторых комментариев, я бы предложил при запуске * ENTER создать каталог и использовать команду touch для создания некоторых файлов и убедиться, что ни один из них, или, по крайней мере, убедиться, что первый в алфавитном порядке, не является именем любого сценария или команды в пути.

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

Так что ls * это немного клише

В Windows * обрабатывается командой, поэтому dir *.* Не является клише.

Примечание: я бы добавил, что, посмотрев некоторые комментарии, есть риск запустить * затем ENTER. Если у вас есть файл с именем rm, который находится первым в списке каталогов, то это опасно, потому что все, что после него будет удалено. Кроме того, и это менее вероятно, если первый файл в списке каталогов является именем сценария в пути, тогда он запустит его.

-1

Оболочка выполняет несколько расширений, прежде чем аргументы будут переданы команде.

Смотрите также https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion

Не относится к bash, см. Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .