comment faire bash pour ne pas envelopper la sortie?

33

Chaque fois qu'une commande génère de longues lignes en sortie (par exemple, lorsqu'un ls -ldossier contient des fichiers avec des noms longs), les longues lignes sont encapsulées à la ligne suivante, gâchant ainsi la structure des colonnes.

Y a-t-il un moyen d'éviter cela? Quelque chose qui ressemble à l'option vim «nowrap»?


mise à jour

J'ai remarqué un problème avec la réponse acceptée:
si je crée un alias comme: alias ll="tput rmam; ls -l; tput smam"
puis j'essaye de grep sa sortie: ll | grep foo
il imprimera toujours tous les fichiers, comme sans grep.

La solution que j'ai trouvée est de mettre des crochets autour de l'alias entier:
alias ll="(tput rmam; ls -l; tput smam)"

Mihai Rotaru
la source
connexes unix.stackexchange.com/questions/20493/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

27

Notez que cela n'a rien à voir avec bash (une fois que vous avez lancé la commande, bash attend juste qu'elle se termine) et tout à voir avec le terminal.

La plupart des émulateurs de terminaux s'enroulent dans la marge de droite par défaut. Mais cela peut être désactivé en utilisant la séquence de contrôle appropriée , si l'émulateur de terminal la prend en charge; alors les longues lignes sont simplement tronquées:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'
Gilles 'SO- arrête d'être méchant'
la source
oui, c'est ce que je cherchais, merci Gilles!
Mihai Rotaru
12
Plus facilement:tput rmam; ls -l longname; tput smam
pause jusqu'à nouvel ordre.
encore mieux; mais d'où vient [rs] mam? J'ai cherché dans les manuels tput et termcap mais je n'ai rien trouvé à leur sujet?
Mihai Rotaru
2
@Mihai: essayez la documentation terminfo ( man 5 terminfosous Linux).
Gilles 'SO- arrête d'être méchant'
en effet, il est là
Mihai Rotaru
17

Si vous souhaitez pouvoir faire défiler horizontalement au lieu de tronquer les lignes, utilisez less -S.

En pause jusqu'à nouvel ordre.
la source
5

Vous pouvez utiliser une fonction comme celle-ci:

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

gardez à l'esprit que vous devrez préfixer les commandes avec nowrapou quel que soit le nom de la fonction.

John T
la source
cela fonctionne, mais je perds le codage couleur; un moyen de préserver cela aussi?
Mihai Rotaru
3

Vous pouvez remplacer une fonction pour qu'elle s'exécute automatiquement tput rmamavant votre grep et tput smamaprès:

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

Déposez cela dans votre .bash_profileet à chaque fois que vous exécutez grep, il va grep sans retour à la ligne.

Cela a été lourdement édité, excuses aux commentateurs.

ognockocaten
la source
C'est sleep 20incroyable :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
2

redirigez-le vers la commande less avec le commutateur -S:

ls -l | less -S

Ensuite, vous pouvez utiliser les flèches haut / bas / gauche / droite pour faire défiler et taper q pour quitter.

qartal
la source
1

Essaye ça

function nowrap { export COLS=`tput cols` ; cut -c-$COLS ; unset COLS ; echo -ne "\e[0m" ; }
drigoSkalWalker
la source
désolé pour la pelle en or
drigoSkalWalker