Обновить
2
0
amosk @amosk

Пользователь

Отправить сообщение
У вас просто негативно настроенный склад ума.
В общем такое решение:
echo "a b" | perl -e 'open($OUT[$_], "|$ARGV[$_]") or die "$!:$ARGV[$_]\n"for 0..$#ARGV; while (my $l = <STDIN>) { for (0..$#ARGV) { my $OUT = $OUT[$_]; print $OUT $l}} close($_) for @OUT' "cat -" "cat -"


В перл передается поток через stdin, там открываются локальные пайпы для stdin каждого переданного аргумента (являющегося произвольной командой допустимой в шелле) и в каждый такой пайп выводится копия потока.
А уже задача каждой команды как то обработать или просто вывести свою копию потока в stdout.

В данном примере указаны команды «cat -» и «cat -», т.е. создаются 2 копии потока и просто выводятся в stdout.

Естественно без отладки из головы каждый раз такую команду не наберешь, поэтому для практического применения вероятно нужно оформить в виде алиаса или отдельного скрипта (это легко сделать, т.к. тело команды не надо менять для разного числа аргументов).
Я думаю это решаемо (даже без именованных пайпов).
Просто возможно будет громоздко.
Чуть позже напишу решение.
mkfifo /tmp/fifo1; echo "a" | tee /tmp/fifo1 | (cat /tmp/fifo1 | (cmd1); cat - |(cmd2)); r m -f /tmp/fifo1

Вместо cmd1 и cmd2 подставить соответственно команды для каждой ветки
Именно однострочником надо?
Потому что через именованные пайпы можно безо всякого оверхеда это делать, но там отдельными командами нужно создать/удалить пайп
Это правда не будет работать если в строках будут кавычки "".
Но для данной задачи — сойдет. По крайней мере лучше чем хак через stderr
Привожу пример:
echo "a" | xargs -I % sh -c 'echo "%/1"; echo "%/2"'
Применительно к данной статье:
echo "/usr/bin/gnote"| xargs -I % sh -c 'echo "%"; ldd "%"|cut -d" " -f3|grep "\S"'
Да, был неправ
А, сорри, не разглядел сразу что последующее объединение происходит не сразу, а через вызов.

Если придумаю что-то — напишу сюда :)
Единственное непонятно — нафига использовать stderr не по назначению, когда размножение строк можно было точно так же и через stdout сделать: tee /dev/stdout
Проблема в том что в математике вообще не рассматриваются многие проблемы решаемые в программировании.

Например абсолютно корректная программа может не работать в реальной системе (например из-за ошибки в ОС), а в математике такое невозможно.

Если есть внешние ссылки на объект то для него не должен вызываться деструктор.
Деструктор вызывается только после того как последняя ссылка удалена.
Есть еще слабые ссылки, но там по определению сначала делается попытка создать сильную ссылку и она не удастся если объект в состоянии когда возможен вызов деструктора.

Так что ситуация когда деструктор вызывается параллельно с другими методами объекта — это просто потоконебезопасный код (внешний по отношению к объекту) и синхронизацией внутри объекта это нельзя устранить…
Это невалидный код. И синхронизация деструктора не сделает его валидным — она просто перенесет проблему из деструктора за его пределы.

Если есть ссылка доступная из нескольких потоков, то прежде чем вызывать для нее методы, надо ее скопировать в локальную переменную и после этого проверить копию на null.

При таком подходе (и при условии что подсчет ссылок в языке реализован атомарно, надеюсь в дельфи так и есть) деструктор вызывается только тогда когда никакие другие методы объекта не запущены.

Поэтому синхронизация в деструкторе бессмысленна.
Тут недавно кто-то обнаружил что у одного из гражданских министерств UK выделенный им блок /8 (51.0.0.0) уже много лет стоит никем не использованный (ни единого устройства в этом диапазоне).

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

А также не совсем прямая связь между «новичок на Хабре» и «карма» :)
Когда это юзеров стал интересовать размер трояна?
Правда в пределах одной платформы (x86, x86_64...)
Не знаю как килоггер, а бинарник запускающися на всех версиях линукса сделать просто.
Достаточно слинковать статически с libc и другими библиотеками.

Информация

В рейтинге
Не участвует
Откуда
Одесса, Одесская обл., Украина
Зарегистрирован
Активность