Непонятно, что вы пытаетесь сделать, но вот что вы делаете:
echo "grep a | grep b"
выводит строку grep a | grep b
.
Это вывод с обратной галочки. Вы используете обратные пометки в положении, когда оболочка хочет команду, поэтому "grep" a '' | ' 'grep' 'b' "используется в качестве командной строки, причем все токены интерпретируются буквально (я добавил одиночные кавычки, чтобы сделать это немного более понятным, надеюсь), поэтому оболочка игнорирует ввод из echo
и вместо этого пытается искать регулярное выражение a
в именованных файлах. У вас, очевидно, нет файлов с именами «|», «grep» или «b», поэтому вы получаете сообщение об ошибке.
То, что вы можете хотеть, это
echo abc | grep a | grep b
, который ищет «a» в выходных данных «echo», а затем ищет «b» в выходных данных первого grep. Поскольку abc
соответствует регулярному выражению a
, первое grep
завершается успешно, поэтому соответствующая строка печатается; и поскольку оно также соответствует регулярному выражению b
, оно печатается также и в конце grep
.
Чтобы немного расширить это, попробуйте следующее:
sh$ echo abc; echo bcd; echo xya
abc
bcd
xya
sh$ ( echo abc; echo bcd; echo xya ) | grep a # print lines matching a
abc
xya
sh$ (echo abc; echo bcd; echo xya ) | grep a | grep b # print lines matching a and b
abc
Непонятно, почему вы используете backticks; если это не то, чего вы пытаетесь достичь, пожалуйста, объясните более подробно, чего вы хотите достичь.
Если вы хотите найти строки, соответствующие a или b, попробуйте это:
sh$ ( echo abc; echo bcd; ) | grep '[ab]'