Как получить строки для терминалов? (по сравнению с 'echo $ COLUMNS') [duplicate]

for L in `cat FILE` | while read L; do echo "$L";done

Я очень сомневаюсь, что это то, что вы используете.Цикл for не завершен, и вы должны получить синтаксическую ошибку. Выполнение команды в режиме подстановки команд внутри списка слов for ​​(как в for L в $(cat foo); do... ) разделило бы все слова на отдельные строки (и подвергнуть их подстановке имен файлов).

Тем не менее, что-то вроде

iptables -vL | while read L; do echo "$L"; done

выдаст результат, который вы получите: read разделяет ввод на IFS и, как побочный эффект, уничтожает начальные и конечные пробелы. Дайте ему пустой IFS, чтобы получить то, что вы хотите. Кроме того, настоятельно рекомендуется использовать read -r для отключения обработки обратной косой черты, даже если вывод iptables вряд ли их содержит. Итак:

iptables -vL | while IFS= read -r L; do echo "$L"; done

Или из файла, без cat:

while IFS= read -r L; do echo "$L"; done < file

Если ваша цель состоит в том, чтобы каким-то образом изменить входные строки, вы также можете взглянуть на awk или Perl, чтобы сделать это , вместо оболочки.

0
23.04.2018, 16:01
2 ответа

stty sizeвыводит количество строк и столбцов текущего терминала; чтобы извлечь количество строк, оставьте только первое поле:

stty size | cut -d\  -f1
1
28.01.2020, 02:18

Эквивалентом $COLUMNSдля строк является $LINES. Это устанавливается некоторыми оболочками, такими как zshили bash(, хотя в случае bashтолько в интерактивном режиме )на основе самих настроек дисциплины линии устройства tty (, обычно устанавливаемых эмулятором терминала или в случай ssh, по sshdиз значений, предоставленных клиентом (Я не знаю, отправляет ли ConnectBotэти )).

Вы сможете найти информацию на справочной странице вашей оболочки. Например, дляzsh:info zsh LINES.

Другие варианты:

  • в некоторых системах (и , которые станут стандартом в будущих версиях POSIX ), stty sizeвозвращает ту же информацию, что и <lines> <columns>, в одной строке. На других они обычно отображаются в выводе stty -a, хотя и в формате, который зависит от системы к системе.
  • С ncursesреализацией tputвы можете использовать tput linesи tput colsдля получения количества строк и столбцов (, которые могут вернуться к запросу базы данных terminfo, когда информация не может быть извлечена. с оконечного устройства ).
  • Некоторыеxterm-например, эмуляторы терминала (Я не знаю, так ли обстоит дело с ConnectBot ), позволяющим вам запрашивать размер терминала с помощью некоторых escape-последовательностей(\e[18t). Например, сzsh:

    IFS=";" read -sd t $'ignore?\e[18t' lines cols
    

    для сохранения размеров в $linesи $cols.

  • с большинством терминалов вместо управляющей последовательности \e[18tтакже можно использовать (более распространенные )управляющие последовательности, которые перемещают курсор в правый нижний угол экрана и запрашивают позицию курсора там.Это то, что на самом деле делает утилита resize, поставляемая с xterm, и может использоваться для согласования настроек tty с этим и установки переменных среды $LINESи $COLUMNSдля тех оболочек, которые еще не делают этого самостоятельно:

    eval "$(resize -u)"
    
3
28.01.2020, 02:18

Теги

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