LinuxForum.Fans
Тема

Консоль: отключение переноса строк

Автор: SamuelLinux 11 сообщений 3175 просмотров
#163795

Здравствуйте.

При работе в командной строке вывод зачастую содержит длинные текстовые строки, которые, не умещаясь в видимой области экрана, переносятся на следующую или несколько следующих строк консоли.

Возможно ли отключить перенос длинных строк или расширить горизонтальный буфер экрана таким образом, чтобы длинная текстовая строка полностью умещалась в строке терминала?

Спасибо.

Debian GNU/Linux 6.0.1;

Bash 4.1.5.

#163828

Подскажите какая от этого польза, пожалуйста. В чем смысл? Ведь конца строки тогда не видно. Записать команду в файле, в переменной или создать псевдоним длинной команды и в командной строке запускать их Вам вероятно не подходит.

#163833

Перенаправить вывод в файл, не не то?

#163840

Мне это нужно для того, чтобы улучшить восприятие вывода некоторых команд.

Посмотрите пример.

На картинках отображен вывод справочной информации по использованию некоторой команды. Вывод разделен на две колонки: в левой перечислены ключи, в правой — их назначение. На левой картинке включен режим переноса строк. Это приводит к смешению данных левой и правой колонок и затрудняет восприятие предложенной информации. На правой картинке режим переноса строк отключен, что не вносит каких-либо затруднений в восприятие данного текста.

#163846


Перенаправить вывод в файл, не не то?

Да, можно перенаправить в файл, а затем открыть его в текстовом редакторе с отключенным переносом строк и уже работать с текстом. Но мне бы хотелось иметь возможность нормально работать с «длинным» текстом сразу же после его вывода, без перенаправления.

#163861

а если не в файл, а в пейджер?

#163914


а если не в файл, а в пейджер?

Это не всегда работает.

Во-первых, для некоторых приложений, а так же для интерпретаторов языков программирования (Ruby, Python) существуют интерактивные командные оболочки. Они позволяют построчно вводить команды или инструкции этих приложений или языков и сразу же получать результат. Так вот, при работе в этих оболочках нельзя использовать стандартные средства командной строки, а соответственно, нет возможности перенаправлять вывод в пейджер.

Вот характерный пример с интерактивной командной оболочкой СУБД SQLite.

На обеих картинках показан сеанс работы в консоли SQLite. Выполнена инструкция языка SQL select, которая должна возвратить значения указанных колонок в некоторой таблице. Консоль настроена таким образом, что данные выводятся поколоночно. На левом изображении перенос строк сделал вывод абсолютно нечитаемым. Однако, на правом изображении где я, в качестве иллюстрации, сымитировал отсутствие переноса, вывод вполне понятен и с ним можно нормально работать.

Во-вторых, как оказалось утилита less не может нормально обрабатывать вывод с потока STDERR. Суть изъяна в том, что если данный поток выводит что-либо в консоль, и мы затем посредством канала передаем этот вывод пейджеру, то эта утилита не позволяет производить с ним некоторые действия, в частности пролистывать вверх и вниз, а также задавать режим переноса.

Вот изображение иллюстрирующее происходящее.

На верхней картинке в консоли выполнена команда `$ ruby -e '$stdout.puts "<длинный_текст>"' | less -S`. Данная команда выполняет инструкцию языка Ruby, которая, в свою очередь, осуществляет печать в поток STDOUT некоторый длинный текст. Далее результат данной команды, собственно текст, перенаправляется утилите less, запущенной с ключом -S, который должен предотвратить перенос длинных строк, что и происходит.

Однако, заменив в предыдущей команде константу $stdout на $stderr, мы осуществляем печать в поток STDERR и затем также передаем напечатанный текст пейджеру. Результат работы данной команды показан на нижнем изображении. Видно, что пейджер проигнорировал ключ -S и отказался переносить строки.

#163921
SamuelLinux написал:
Однако, заменив в предыдущей команде константу $stdout на $stderr, мы осуществляем печать в поток STDERR и затем также передаем напечатанный текст пейджеру. Результат работы данной команды показан на нижнем изображении. Видно, что пейджер проигнорировал ключ -S и отказался переносить строки.

А мы уверены, что отказался имеено именно пейджер и less с ключём? То есть, что выходной поток пошел именно в stdout? Что он не пошел в stderr? Ведь stderr пойдет мимо мейждера, в данном случае - прямо на консоль. А less -S будет в сторонек бамбук курить. Я не ошибаюсь?

#163963
SamuelLinux написал:
ruby -e '$stdout.puts "<длинный_текст>"' | less -S`

само собой он идёт мимо пейджера...

text
ruby -e '$stdout.puts "<длинный_текст>"' 2>&1 | less -S`
#163964

Я не ошибаюсь?

Вы правы.

Действительно, поток STDERR идет мимо less. Меня ввело в заблуждение то, что перенаправляемый текст по завершению команды виден в окне пейджера. Оказывается, что для передачи STDERR в канал, нужно сначала перенаправить вывод этого потока в поток STDOUT, используя инструкцию `2>&1`.

Вот пример:

[console]
$ ruby -e '$stdout.puts "<длинный_текст>"; $stderr.puts "<длинный_текст>"' 2>&1 | less -S
[/console]

#163965


само собой он идёт мимо пейджера...

Спасибо, я уже разобрался с этим.

Войдите или зарегистрируйтесь, чтобы ответить.