как понять <(echo )в этой командной строке?

Возможно, этот порт не открыт ни на маршрутизаторе, ни в брандмауэре компьютера.

Это может помочь, если вы используете Red Hat:https://superuser.com/questions/794104/how-to-permanently-disable-firewall-in-red-hat-linux

0
18.05.2021, 18:08
2 ответа

Это просто приводит к выводу последнего содержимого, буферизованного в переменной i. Это создает пустую строку, поэтому awk запускается еще раз для этой пустой строки, и поэтому он выводит буферизованное значение в переменной i. вместо <(echo)вы можете использовать блок END{ print i }.

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

2
28.07.2021, 11:31

<( — это «подстановка процессов», которая является особенностью GNU Bourne -Again Shell (Bash ). Это не в POSIX.

Подстановка процесса — это часть синтаксиса, которая расширяется до аргумента командной строки. Целевая программа может открыть аргумент, как если бы это было имя файла. Результирующий файловый дескриптор подключается к командному каналу, указанному в синтаксисе в скобках.

Таким образом, <(echo)расширяется до некоторого слова, подобного /magic/path/53. Когда программа получает этот путь и открывает его для файла в качестве входных данных, она получает дескриптор канала, который читается из echo.

Что делает echo? Выдает пустую строку.

Единственная разница между

some-command <(echo)

и

some-command /dev/null

заключается в том, что <(echo)выдает пустую строку, тогда как /dev/nullничего не выдает.

Вы можете представить, что <(echo)— это путь к файлу, содержащему одну пустую строку (, если этот путь открыт только для ввода, а не для вывода ).

Здесь идея, похоже, состоит в том, чтобы гарантировать, что ввод в awkсодержит завершающую пустую строку. То есть, что бы ни было во входном файле test.cov, там будет дополнительная пустая строка. Этого требует логика скрипта, потому что он сохраняет состояние между последовательными строками. Существует переменная i, содержимое которой зависит от предыдущей строки и печатается при поступлении следующей строки. i, рассчитанный для последней строки, никогда не печатается, поэтому без дополнительной пустой строки из <(echo)последняя строка test.covне будет полностью обработана.

Обратите внимание, что если test.covотсутствует завершающий символ новой строки, то <(echo)не просто добавит эту новую строку; несколько входных файлов для awk не просто объединяются в один символьный поток. Запись будет разделена в конце первого файла, независимо от того, присутствует ли новая строка, а второй файл создает новую запись.

Существует простой способ удалить зависимость от функции подстановки процесса из окружающей оболочки:

awk '{if($1==x){i=i" "$2}else{if(NR>1){print i};i=$0};x=$1;y=$2}; END {print i}'

Вот именно! Мы добавляем блок END, который печатает все накопленные i. Нам не нужен там тест NR > 1, потому что если NR == 0, это означает, что никакие записи не обрабатывались, и поэтому iне определено и печатается как ничего. Однако в этом случае выводится пустая пустая строка, чего можно избежать с помощью END {if (i) print i}.

2
28.07.2021, 11:31

Теги

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