Кто имеет дело со звездой * в эхо *

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

echo *

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

Как насчет

cp temp temp*

4 ответа

Решение

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

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

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

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

В 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, который находится первым в списке каталогов, то это опасно, потому что все, что после него будет удалено. Кроме того, и это менее вероятно, если первый файл в списке каталогов является именем сценария в пути, тогда он запустит его.

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

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

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

Другие вопросы по тегам