Этот проект основан на инструменте сборки cmake
.
Вы должны сгенерировать Makefile
перед запуском cmake
в текущем каталоге проекта.
Затем вы можете запустить make
.
Для получения дополнительной информации см. man 1 cmake .
Благодаря @Kusalananda, их ответ заставил меня искать, и я нашел ответ. Если ответ, который они дали, был правильным, еще раз спасибо, извините, лол! В любом случае, добавив >&2
в конце строк, которые я хотел напечатать на терминале! Все еще работаю с ним и делаю его правильным для моего случая, но он работает!
function read_line() {
while true
do
while read -r -t1 REPLY
do
echo 'Hello World' >&2
echo -en '\e[2K\r> ' >&2
echo "PRIVMSG $channel :$REPLY" >> $input
done
done
}
Во-первых, здесь есть что распаковать. Если вы еще не начали использовать shellcheck , то вы должны начать -, это значительно упрощает жизнь, подсвечивая дефекты при записи.
Во-вторых, оболочке НЕ нравится эта строка:echo -en '\e7' "\e[${status_line_row};0f" '\e[2K'
. Я не уверен, что он должен делать, но он заставляет курсор прыгать на одну строку вверх и писать пробел (? ); это не может быть тем, что вам нужно. Сначала исправьте это.
Затем, в контексте этого блока, кажется, что бит while true
вам не нужен.
function read_line() {
while true; do <- unnecessary
while read -r -t1
do
status_line
echo -en '\e[2K\r> '
echo "PRIVMSG $channel :$REPLY" >> $input
done
done <- unnecessary
}
# This should do exactly the same thing but you have to feed the loop
while read -r -t1; do
status_line
echo -en '\e[2K\r> '
echo "PRIVMSG $channel :$REPLY" >> $input
done < /from/file, or
done <<< "$fromVariable" (pick one from file or variable)
Наконец, вот суть , которая должна помочь наметить, как намного проще раскрашивать вывод. Я называю это библиотекой и повторно использую в нескольких сценариях. PS :Я ненавижу это решение, но оно работает.
function read_line() {
...
while read -r -t1; do
status_line
echo -en '\e[2K\r> '
echo "PRIVMSG $channel :$REPLY" >> $input
...
}
read_line | tail...
it does not correctly do status_line and echo -en '\e[2K\r> ' inside read_line. I am confused why the input is being read but the 2 lines before it aren't working.
Внутри read_line
вы читаете со стандартного ввода с помощью read
и печатаете на стандартный вывод с помощью echo
. (А также в $input
с другим echo
, но это не проблема.)
Заметив, что вы вызываете функцию read_line
как часть конвейера, подумайте, где связаны стандартный ввод и стандартный вывод read_line
? Что конвейер делает с входными и выходными потоками задействованных команд? Что tail
делает со своим стандартным вводом?
Также обратите внимание, что если это >
должно быть подсказкой для пользователя, оно, вероятно, должно быть напечатано перед вызовом read
, а не после него. Либо выполните while echo -en '\e[2K\r> '; read -r -t1; do...
, либо используйте read -p
, чтобы вместо этого напечатать приглашение. Если терминал настроен обычным образом, экран также будет прокручиваться, когда пользователь нажимает ввод на read
, и когда вы что-то печатаете. Если строка состояния находится в верхней части экрана, она прокручивается вне поля зрения. Вам придется что-то с этим делать, и это намного проще с уже существующей библиотекой пользовательского интерфейса -, такой как ncurses
, чем исправлять обработку терминала вручную в оболочке.
Еще одна проблема с IRC-клиентом заключается в том, что ему необходимо иметь возможность читать из двух мест одновременно :оба ввода от пользователя,и данные из сети. Фиксация вывода из openssl
обратно в сценарий для обработки сама по себе несколько неудобна, а необходимость чтения обоих одновременно еще хуже.
Настоящим решением этой проблемы является использование системного вызова select()
(илиpoll()
). Несмотря на то, что Bash предоставляет доступ к сетевым сокетам через /dev/tcp
псевдофайлы -, я не думаю, что он предоставляет select()
.
Итак, на самом деле есть две серьезные причины использовать для этого настоящий язык программирования и а не оболочку .
Конечно, если вы делаете это только как упражнение в безумии, тогда это нормально, но если это так, я предлагаю сначала немного лучше ознакомиться с языком оболочки, прежде чем решать подобную проблему. Кроме того, если вы просто хотите повеселиться с программированием в ограниченной среде без какого-либо реального -мирового значения, я мог бы предложить для этого несколько игр от Zachtronics .