Я знаю, как (более или менее) сделать это в C:
#include <stdio.h>
#include <string.h>
int
main(int argc, char** argv)
{
char buf[BUFSIZ];
fgets(buf, sizeof buf, stdin); // reads STDIN into buffer `buf` line by line
if (buf[strlen(buf) - 1] == '\n')
{
printf("%s", buf);
}
return 0;
}
Желаемым конечным результатом является чтение STDIN из канала, если он присутствует. (Я знаю, что приведенный выше код этого не делает, но я не мог понять, как сделать это только при чтении из канала/heredoc).
Как мне сделать что-то подобное в схеме Chicken?
Как я уже говорил, конечная цель состоит в том, чтобы иметь возможность сделать это:
echo 'a' | ./read-stdin
# a
./read-stdin << EOF
a
EOF
# a
./read-stdin <<< "a"
# a
./read-stdin <(echo "a")
# a
./read-stdin < <(echo "a")
# a
read-stdin
должна открыть и прочитать. Возможно, вы хотели написать:./read-stdin < <(echo "a")
который перенаправляет на стандартный ввод; затем, как только один работает, они все работают. - person Jonathan Leffler   schedule 20.03.2014read-stdin
— это просто примеры. В zsh иcat < <(echo a)
, иcat <(echo a)
дают одинаковый результат. На самом деле у меня нет программыread-stdin
, которая действительно делает вышеперечисленное, я просто пытался проиллюстрировать, каким должен быть конечный результат. - person Alexej Magura   schedule 20.03.2014cat < <(echo a)
иcat <(echo a)
есть разница; в первом оболочка открывает файл, а во второмcat
делает. Итак, последний пример требует действий от вашей предполагаемойread-stdin
программы, отличных от других примеров. Кроме этого, боюсь, это не продвинет вас к ответу. Я бы помог, если бы знал что-нибудь о Chicken Scheme, но я никогда не слышал об этом до вашего вопроса, и я достаточно мало знаю о Scheme (но я как бы использовал его для вещей чуть более сложных, чем «привет, мир»). - person Jonathan Leffler   schedule 20.03.2014