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

6783
faressoft

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

echo * 

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

Как насчет

cp temp temp* 
15
Различается. Оболочки Unix или Windows? grawity 9 лет назад 14
@ Grawity Unix Shell. Извините, я не упомянул это. faressoft 9 лет назад 0
Для Unix ответы ниже верны. (В Windows это делается отдельными программами - хотя обычно автоматически выполняется библиотекой времени выполнения перед main ().) grawity 9 лет назад 0

4 ответа на вопрос

24
Jarmund

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, в этом случае имя источника и назначения совпадают, то есть ничего не будет сделано.
Нет ничего «плохого» в использовании `*` вместо `ls`. Например, `для f в *; do` является * более * надежным, чем `for f in $ (ls)`, если имя файла содержит пробел или глобальный символ. (Однако, он потерпит неудачу, если в CWD нет файлов, поэтому вам нужно проверить этот случай.) rici 9 лет назад 8
@rici Вот для чего нужен shopt nullglob. a CVn 9 лет назад 1
Что касается `echo *`, то этот трюк [может спасти вас] (http://www.ee.ryerson.ca/~elf/hack/recovery.html) в некоторых случаях. a CVn 9 лет назад 3
@ MichaelKjörling Может, и, конечно, спас меня хотя бы один раз. Jarmund 9 лет назад 0
@ MichaelKjörling: Да, это одна из возможностей. Но постановка, которая проводилась по всему миру, часто имеет и неблагоприятные последствия. И вы вполне можете захотеть выдать ошибку: на самом деле часто бывает так, что сообщение об ошибке в форме «не может открыть« директорию / * »: ни один такой файл или каталог» не является полностью подходящим ... rici 9 лет назад 0
Включение: файлы с предваряющим «-» в произвольных папках, которые вызывают нежелательные переключатели. Их удаление не доставляет большого удовольствия, пока вы не поймете, что rm ./-stupidfile работает. ǝɲǝɲbρɯͽ 9 лет назад 2
@ ǝɲǝɲbρɯͽ Я заметил, что когда-то мне нужно было удалить содержимое каталога, содержащего файлы с именем файла, представляющим позиции в системе координат, от -1024x-1024 до 1024x1024. Именно тогда я впервые узнал о побеге. Jarmund 9 лет назад 1
@ Джармунд Думаю, мне нужно освежиться; «mv» не дает тех же подсказок, что и «rm», поэтому я перебрал завершение табуляции, \ - \ - \ - sf = нераспознанная опция (то же самое без экранирования), \\ - такого файла нет. Цитирование не сработало, я попробовал кое-что еще и наконец-то намекнул. Я оценил это, потому что, черт возьми, я собирался обмануть с помощью графического интерфейса (откуда он появился). ǝɲǝɲbρɯͽ 9 лет назад 0
5
jlliagre

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

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

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

4
barlop

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

Обратите внимание, что, конечно, может быть файл с именем `rm`. Volker Siegel 9 лет назад 4
... и еще один называется -rf ǝɲǝɲbρɯͽ 9 лет назад 1
@ ǝɲǝɲbρɯͽ у тебя может быть файл с именем `-rf`? Я пробовал `touch -rf` и` touch \ -rf`, но он не создается. barlop 9 лет назад 1
@ barlop Я прокомментировал выше; графический интерфейс (например, gedit) прекрасно с ними справляется, но поскольку оболочка (по крайней мере, bash) проходит через нее, требуется ./ впереди. Если вы когда-нибудь случайно создадите такой файл, rm попытается намекнуть, но если этого не произойдет: надеюсь, это когда-нибудь закончится только временной папкой с одноразовыми дочерними элементами. ǝɲǝɲbρɯͽ 9 лет назад 0
@ ǝɲǝɲbρɯͽ Я вообще не понимаю, что ты имеешь в виду, я спрашиваю, как ты можешь создать файл с именем `-rf`? (Я понимаю опасность файла с именем rm и файла с именем -rf, а также проблемы ввода * и нажатия клавиши enter в важной папке, я не планирую этого делать) barlop 9 лет назад 0
@barlop В комментарии к ответу Джармунда: rm ./-stupidfile (что означает - неприятность). Здесь коснитесь ./-rf. Предполагая, что вы используете Gnome в Linux, gedit сохраняет файл с именем -anyfile без проблем, но rm -anyfile завершится ошибкой и может предупредить вас "возможно, вы хотели использовать rm ./-anyfile?" вместо этого, который, я думаю, инструктирует оболочку для поиска файла в текущем местоположении (.), а не рассматривает его как переключатель для размещения в потоке параметров. Это предупреждение может зависеть от оболочки. Поскольку мы отвечаем на вопрос, а не на ваш ответ, я не против продолжить разговор в чате. ǝɲǝɲbρɯͽ 9 лет назад 0
@ ǝɲǝɲbρɯͽ предназначена для создания ссылки в чате, если комментарии становятся длинными. И даст возможность импортировать их в. Да, я вижу, что touch ./-rf работает, хотя, поскольку * расширяет «алфавитный» порядок, -rf до rm, он никогда не сможет запустить rm -rf. barlop 9 лет назад 0
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/22871/discussion-between-barlop-and-eebm). barlop 9 лет назад 0
-1
glenn jackman

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

Смотрите также 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

Технически, то, что вы пишете, правильно, но без ссылок этот ответ на самом деле ничего не делает, чтобы ответить на вопрос. Рассмотрите возможность включения соответствующих деталей. a CVn 9 лет назад 0
@ MichaelKjörling Я согласен с вещами о ссылках, но ОП просто спросил, обрабатывает ли аргумент оболочка или сама команда. В ответе Гленна просто говорится, что оболочка обрабатывает их, поэтому это приемлемый ответ на вопрос. slhck 9 лет назад 0
@slhck Вот почему я не пометил как NAA: осталось что-то, что решает вопрос после разрыва ссылок. Это не значит, что это, на мой взгляд, * хороший * ответ. (Теперь я вижу, что мой первоначальный комментарий может быть истолкован иначе; за это я прошу прощения, но я все еще думаю, что он имеет достаточную ценность, чтобы оставить его там, где он есть.) a CVn 9 лет назад 0
@ MichaelKjörling Согласен. Я просто оставил комментарий для тех, кто * сделал * (и будет) помечать его как NAA. slhck 9 лет назад 0

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