Я столкнулся со странностью при выполнении простой команды echo . Кто-нибудь может объяснить, что происходит? Вот сценарий, в папке ровно три файла, и я хочу заменить их содержимое пустым символом. Файлы:

ev_tracker.css  ev_tracker.html  ev_tracker.js

Я попробовал простую команду, чтобы отобразить пробел во всех файлах

$ echo \  > *

и я получил следующую ошибку:

bash: *: ambiguous redirect

Итак, я попытался быть более конкретным ...

$ echo \  > ev_tracker.*
bash: ev_tracker.*: ambiguous redirect

И еще конкретнее ...

$ echo \  > ev_tracker.{css,html,js}
bash: ev_tracker.{css,html,js}: ambiguous redirect

Наконец, я выполнил действие над каждым файлом, индивидуально, без ошибок.

$ echo \  > ev_tracker.css
$ echo \  > ev_tracker.html
$ echo \  > ev_tracker.js
$

Может кто-нибудь объяснить, почему я получил ошибку? Я использую Ubuntu 14.04 и любой другой вариант sh умолчанию.

2 ответа2

2
echo a > *

будет расширен Bash для

 echo a > ev_tracker.css ev_tracker.html ev_tracker.js

в соответствии с man bash (НАПРАВЛЕНИЕ)

Слово, следующее за оператором перенаправления в следующих описаниях, если не указано иное, подвергается (...) расширению пути (...)

Если он расширяется до более чем одного слова, bash сообщает об ошибке.

ты можешь использовать

echo a | tee * > /dev/null

смотрите man tee , команда tee предназначена для того, чтобы делать то, что вы ищете.

обратите внимание также, что

echo \ | tee * > /dev/null

не будет выводить обратную косую черту в файлы.

-2

Вы просто можете сделать это:

$ echo ' ' > ev_tracker*

Согласно комментарию ниже, это то, что я сделал.

$ touch bla blaa blaaa
$ echo ' 1' > bla*
$ cat bla
 1
$ cat blaa
 1
$ cat blaaa
 1

Это работает только с пробелом, но это трудно показать.

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