Канал, стандартные входные параметры и параметры командной строки в Bash

Самый простой алгоритм, и тем не менее тот, который является очень эффективным, должны были бы обнулить R триплета RGB для видимой области.

красный исчезает, но другие цвета сохраняются.

дальнейшее расширение А этого алгоритма могло бы включить обнуление, значение R только для утраивания, где красный является доминирующим цветом (R> G и R> B).

8
задан Peter Mortensen 2 March 2014 в 21:51
поделиться

3 ответа

grep "hehe" < test.sh

Перенаправление ввода - работает, конечно, только для одного файла, тогда как cat работает для любого количества входных файлов.


Обратите внимание на обозначения:

grep "hehe" $(cat test.sh)
grep "hehe" `cat test.sh`

Они эквивалентны в данном контексте; гораздо проще использовать нотацию ' $ (cmd) »во вложенных применениях, например:

x=$(dirname $(dirname $(which gcc)))
x=`dirname \`dirname \\\`which gcc\\\`\``

(Это дает вам базовый каталог, в котором установлен GCC, на случай, если вам интересно.)

В примере grep происходит то, что содержимое test.sh читается и разбивается на слова, разделенные пробелами, и каждое такое слово предоставляется в качестве аргумента на grep . Поскольку grep обрабатывает слова после «хе-хе» (где grep , конечно, не видит двойные кавычки - и они в этом случае не нужен; как правило, используйте одинарные кавычки, а не двойные, особенно вокруг сложных строк, таких как регулярные выражения, которые часто используют метасимволы оболочки) ... Как я уже говорил, grep обрабатывает слова после "хе-хе" " как имена файлов, и пытается открыть каждый файл, обычно неудачно, потому что файлы не существуют. Вот почему такая нотация неуместна в данном контексте.


После повторного рассмотрения вопроса можно сказать еще кое-что, чего еще не было.

Во-первых, многие команды Unix предназначены для работы как 'фильтры'; они считывают ввод из некоторых файлов, каким-то образом преобразуют его и записывают результат в стандартный вывод. Такие команды предназначены для использования в командных конвейерах. Примеры включают:

  • cat
  • grep
  • troff и родственники
  • awk (с оговорками)
  • sed
  • sort

Все эти фильтры имеют одинаковое общее поведение: они используют параметры командной строки для управления своими поведение, а затем они либо читают файлы, указанные в качестве аргументов командной строки, либо, если таких аргументов нет, они читают свой стандартный ввод. Некоторые (например, sort ) могут иметь параметры для управления тем, куда направляется их вывод вместо стандартного вывода, но это относительно редко.

Есть несколько чистых фильтров - tr один такие - которые строго читают стандартный ввод и записывают в стандартный вывод.

Другие команды имеют другое поведение. Эрик Рэймонд представляет таксономию типов команд в книге « Искусство программирования UNIX ».

Некоторые команды генерируют списки имен файлов на стандартном выводе - два классических примера - ls и find .

Иногда требуется применить вывод генератора имен файлов как аргументы командной строки для фильтра. Есть программа, которая делает это автоматически - это xargs .

Обычно вы должны использовать:

find . -name '*.[chyl]' | xargs grep -n magic_name /dev/null

Это создаст полный список файлов с расширениями ' .c ',' .h ',' .y 'и' .l '(исходный код C, заголовки, файлы Yacc и Lex). Поскольку список читается xargs , он создает командные строки с grep -n magic_name / dev / null в начале и каждым словом (разделенным пробелом) в качестве аргумента.

В старые времена имена файлов Unix не t включать пробелы. Под влиянием Mac и Windows такие пространства стали обычным явлением. Версии GNU find и xargs имеют дополнительные параметры для решения этой проблемы:

find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null

Параметр ' -print0 ' означает, что имена файлов печати заканчиваются a NUL '\ 0' "(потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL, и, очевидно, '/' может появляться в именах путей). Соответствующее ' -0 ' указывает xargs искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.

find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null

Параметр ' -print0 ' означает «печатать имена файлов, заканчивающиеся NUL '\ 0'» (потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL , и, очевидно, в именах путей может присутствовать '/'). Соответствующий ' -0 ' указывает xargs искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.

find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null

Параметр ' -print0 ' означает «печатать имена файлов, заканчивающиеся NUL '\ 0'» (потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL , и, очевидно, в именах путей может присутствовать '/'). Соответствующее ' -0 ' указывает xargs искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.

14
ответ дан 5 December 2019 в 07:59
поделиться

Другой формой перенаправления является подстановка процесса.

grep "hehe" <(cat test.sh)

эквивалентно:

grep "hehe" test.sh

, которые оба смотрят на содержимое самого test.sh .

Хотя , как было отмечено, эта команда:

grep "hehe" $(cat test.sh)

ищет имена файлов в test.sh и использует их в качестве аргументов для grep . Итак, если test.sh состоит из:

scriptone
scripttwo

, то grep будет искать «хе-хе» в содержимом каждого из этих файлов.

6
ответ дан 5 December 2019 в 07:59
поделиться

Используется как стандартный ввод.

Попробуйте:

grep "hehe" - $(cat test.sh)

Возможно, это неверно; Я не могу проверить это на этом компьютере. Если вы сделаете это без канала, как вы пытались, grep обработает последний аргумент как имя файла, т. Е. Ищет файл с именем [содержимое test.sh]. Если вы передадите ему - (или не укажете последний аргумент), вы укажете ему использовать stdin в качестве файла.

Вы также можете просто передать grep файл для сканирования:

grep "hehe" test.sh

... но вы похоже, задают более общий вопрос bash, а не вопрос использования grep, так что это, вероятно, не слишком полезно.

1
ответ дан 5 December 2019 в 07:59
поделиться
Другие вопросы по тегам:

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