Похоже, что функция Bash не хочет корректно запускать строки

Этот проект основан на инструменте сборки cmake.

Вы должны сгенерировать Makefileперед запуском cmakeв текущем каталоге проекта.

Затем вы можете запустить make.

Для получения дополнительной информации см. man 1 cmake .

0
24.04.2021, 09:09
3 ответа

Благодаря @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
}
0
28.04.2021, 22:51

Во-первых, здесь есть что распаковать. Если вы еще не начали использовать 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 :Я ненавижу это решение, но оно работает.

-1
28.04.2021, 22:51
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 .

1
28.04.2021, 22:51

Теги

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