30

Всякий раз, когда какая-либо команда генерирует длинные строки в качестве выходных данных (например, когда ls -l - папка, содержащая файлы с длинными именами), длинные строки переносятся на следующую строку, что портит структуру столбцов.

Есть ли способ избежать этого? Что-то похожее на vim-опцию nowrap?


Обновить

Я заметил проблему с принятым ответом:
если я сделаю псевдоним: alias ll="tput rmam; ls -l; tput smam"
и затем попытайтесь получить вывод: ll | grep foo
он все равно будет печатать все файлы, как без grep.

Решение, которое я нашел, состоит в том, чтобы заключить в скобки весь псевдоним:
alias ll="(tput rmam; ls -l; tput smam)"

6 ответов6

26

Обратите внимание, что это не имеет ничего общего с bash (после того, как вы запустили команду, bash просто ждет ее завершения) и со всем, что связано с терминалом.

Большинство эмуляторов терминала по умолчанию переносятся с правого поля. Но это можно отключить с помощью соответствующей последовательности управления, если эмулятор терминала это поддерживает; тогда длинные строки просто усекаются:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'
13

Если вы хотите иметь возможность выполнять горизонтальную прокрутку вместо усечения строк, используйте команду less -S.

3

Вот псевдоним .bash_profile который я использую для автоматического отключения переноса при выполнении команды grep ping:

alias grep='tput rmam; { sleep 20 && tput smam & }; grep'

tput rmam отключает перенос.

{ sleep 20 && tput smam & } возобновит перенос через 20 секунд. Символ & в конце заставляет его работать в фоновом режиме, поэтому grep может работать в это время. Вам нужно повторно активировать упаковку, потому что она не портит ваш терминал. В моем случае tput rmam заставлял команды длиннее ширины терминала перезаписывать себя вместо переноса на новую строку (очень раздражает).

И тогда grep делает свое волшебство, без упаковки! Однако, если запуск займет больше 20 секунд, обертывание вернется с удвоенной силой, поэтому вы можете захотеть установить его дольше в зависимости от вашей системы.


РЕДАКТИРОВАТЬ:

Еще лучший подход - использовать функцию, которая автоматически запускает tput rmam перед вашими grep и tput smam после:

function grp () {
  tput rmam;
  grep "$@";
  tput smam;
}

Бросьте это в свой .bash_profile и всякий раз, когда вы запустите grp , он будет работать без переноса строки.

3

Вы можете использовать такую функцию:

nowrap() 
{ 
   cut -c-$(tput cols); 
}

имейте в виду, что вам придется добавлять префикс к командам nowrap или как вы называете функцию.

1

Попробуй это

function nowrap { export COLS=`tput cols` ; cut -c-$COLS ; unset COLS ; echo -ne "\e[0m" ; }
1

передать его команде less с ключом -S:

ls -l | less -S

Затем вы можете использовать стрелки вверх / вниз / влево / вправо для прокрутки и введите q, чтобы выйти.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .