Кто имеет дело со звездой * в эхо *
Кто имеет дело (интерпретирует) * в
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