nc
не поддерживает параллельную работу с несколькими подключенными клиентами и не подходит для этой задачи. Для этой работы есть несколько подходящих инструментов, в том числе:
tcpserver
(оригинал или djbwares )или Хоффманtcpserver
:tcpserver -v -R -H -l 0 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
tcpserver
прокладка:tcpserver -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
tcp-socket-listen 88.109.110.161 100 tcp-socket-accept --verbose sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
s6-tcpserver4
:s6-tcpserver4 -v 2 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
s6-tcpserver4-socketbinder 88.109.110.161 100 s6-tcpserver4d -v 2 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
tcpsvd
:tcpsvd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
onenetd
:onenetd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
cyclog port100/
И можно заменить multilog
, s6-log
, svlogd
или tinylog
на cyclog
.
tcpserver
. ucspi -TCP. tcpserver
. ucspi -tcp6 . fehcom.de. s6-tcpserver4
. Лоран Берко. s6 -сеть . skarnet.org. tcpsvd
.ipsvd . Геррит Пейп. www.smarden.org. tcpserver
. djbwares . Программное обеспечение. tcp-socket-listen
. Направляющая ноша . Программное обеспечение. tcp-socket-accept
. Направляющая ноша . Программное обеспечение. tcpserver
. Направляющая ноша . Программное обеспечение. Вы можете сделать это довольно легко, используя массивы в bash (, который является оболочкой по умолчанию в Ubuntu, macOS использует либо bash, либо zsh для более новых версий; эти решения о bash):
Выбрать все файлы (ваша исходная команда, слегка измененная):
$ shopt -s nullglob
$ files=(*)
$ echo "${files[@]}"
file.abc file.ABC file.def file.ghi file.jkl file.sh
Включение опции nullglob
дает пустой список, если каталог пуст. Без этой опции, если бы каталог был пуст, files
был бы списком из одного элемента, который является нерасширенным *
.
Выберите только те файлы, имена которых заканчиваются на .abc
, .ABC
или .def
:
$ shopt -s nullglob
$ files=(*.abc *.ABC *.def)
$ echo "${files[@]}"
file.abc file.ABC file.def
Выберите все файлы, кроме тех, имена которых заканчиваются на .sh
или.jkl
$ shopt -s extglob nullglob
$ files=(!(*.sh|*.jkl))
$ echo "${files[@]}"
file.abc file.ABC file.def file.ghi
Сопоставление без учета регистра
$ shopt -s nocaseglob nullglob
$ files=(*abc)
$ echo "${files[@]}"
file.abc file.ABC
Также, заметка о том, что вы делали. files="$PWD/*"
не устанавливает значение $files
для всех файлов в вашем текущем каталоге. Он устанавливает свое значение в строку, оканчивающуюся на /*
:
$ cd /tmp/current_directory
$ files="$PWD/*"
$ echo "$files"
/tmp/current_directory/*
Причина, по которой вы думали, что это сработало, заключалась в том, что вы использовали echo $files
без кавычек, что означает расширение оболочки /tmp/current_directory/*
. Однако если вы затем удалите файлы,та же самая команда echo
будет просто печатать /tmp/current_directory/*
с $PWD
, расширенным до любого каталога, в котором вы изначально запустили это. Список файлов не будет сохранен с переменной. Использование массивов, как я сделал здесь, гарантирует, что переменная хранит фактический список файлов, а не только глобус, который может быть расширен до разных значений в зависимости от того, где вы его используете.
Вzsh
:
files=($PWD/*.(abc|ABC|DEF)(N))
print -rC1 -- $files # print raw, on one column.
(с квалификатором (N)
, чтобы применить nullglob
к этому глобусу, чтобы $files
стал пустым списком шаблона, не соответствующего ни одному файлу, вместо сообщения об ошибке ).
Для файлов, отличных от .sh
и.jkl
:
set -o extendedglob # needed for the ^ negation operator
files=($PWD/^*.(sh|jkl)(N))
Для сопоставления без учета регистра(.ABC
/ .abc
/ .Abc
...):
set -o extendedglob
files=($PWD/*.(#i)abc(N))
Ваш:
FILES="$PWD/*"
echo $FILES
неверно в нескольких аспектах:
FILES="$PWD/*"
не хранит список файлов в переменной $FILE
. Это скалярное присваивание, которое может хранить только одно значение. Вместо этого он сохраняет в $FILES
содержимое $PWD
, за которым буквально следует /*
.
В, echo $FILES
, так как $FILES
не цитируется, в bash
(, но не в zsh
), расширение $FILES
подлежит split+glob. И это в этот момент, и если предположить, что $FILES
не содержит ни одного из символов $IFS
(, которые вызовут разделение часть ), и что $PWD
не содержит подстановочных знаков (. ], что также вызовет часть glob ), в которой значение расширяется до списка соответствующих файлов.
В zsh
split+glob не выполняется неявно при расширении параметра, вам нужно запросить их явно($=FILES
для разделения, $~FILES
для подстановки, $=~FILES
для обоих ).
Тогда использование echo
для вывода произвольных данных неверно, так как echo
выполняет дополнительную обработку по умолчанию (в zsh
, вы можете использовать echo -E - $files
или print -r -- $files
, хотя ).