Quando ls
é executado, ele analisa várias opções. Ele também detecta se a saída é uma tty ou não por isatty () .
ls.c:
case LS_LS:
/* This is for the 'ls' program. */
if (isatty (STDOUT_FILENO))
{
format = many_per_line;
/* See description of qmark_funny_chars, above. */
qmark_funny_chars = true;
}
else
{
format = one_per_line;
qmark_funny_chars = false;
}
break;
...
/* disable -l */
if (format == long_format)
format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
etc.
Se você quiser, pode compilar um teste simples:
isawhat.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
if (isatty(STDOUT_FILENO)) {
fprintf(stdout, "Word by word my world.\n");
} else {
fprintf(stdout, "HELP! Stranger handling my words!!\n");
}
fprintf(stderr, "Bye bye.\n");
return 0;
}
Compile por:
gcc -o isawhat isawhat.c
Então, por exemplo:
$ ./isawhat | sed 's/word/world/'
A largura é medida em colunas. Uma coluna é um caractere. Começa com 80 , depois verifica se a variável de ambiente COLUMNS estiver definida e tiver um int válido que não seja maior que SIZE_MAX (que é dependente de arco - seu terminal nunca será tão amplo (pelo menos ainda não)).
Experimente, por exemplo %código%. Isso provavelmente reflete o número de colunas disponíveis na janela. À medida que a janela é redimensionada, atualize-se. É muito provável que também seja redefinido por vários comandos.
Uma maneira de definir um pouco mais é por echo $COLUMNS
. Por exemplo. %código%. Use stty
para ver todos (man stty). Um divertido pedaço de software.
Se compilado nele, consulte também as colunas em ioctl () , Detectar o tamanho da janela. . Passando o número de filiação de stdout para stty columns 60
e passando o pedido TIOCGWINSZ a estrutura stty -a
é preenchida com o número de colunas.
Isso também pode ser demonstrado por um código c simples:
Compile, execute e redimensione a janela. Deve atualizar. Ctrl + C para sair.
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <signal.h>
static int run;
void sig_handler(int sig) {
switch (sig) {
case SIGINT:
case SIGTERM:
case SIGSTOP:
run = 0;
break;
}
}
void sig_trap(int sig) {
if ((signal(sig, sig_handler)) == SIG_IGN)
signal(sig, SIG_IGN);
}
int main(void)
{
struct winsize ws;
sig_trap(SIGINT);
sig_trap(SIGTERM);
sig_trap(SIGSTOP);
run = 1;
while (run) {
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) {
fprintf(stdout, "\r %s: %3d, %s: %d\r",
"Columns", ws.ws_col,
"Rows", ws.ws_row
);
fflush(stdout);
}
usleep(5000);
}
fprintf(stdout, "\n");
return 0;
}