От help let
:
Exit Status:
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise..
С тех пор var++
постинкремент, я предполагаю, что последний аргумент действительно оценивает для обнуления. Тонкий...
Возможно, более четкая иллюстрация:
$ let x=-1 ; echo x=$x \$?=$?
x=-1 $?=0
$ let x=0 ; echo x=$x \$?=$?
x=0 $?=1
$ let x=1 ; echo x=$x \$?=$?
x=1 $?=0
$ let x=2 ; echo x=$x \$?=$?
x=2 $?=0
Когда ls
выполняется это анализирует различные варианты. Это также обнаруживает, если произведенный tty или не 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);
и т.д.
Если Вы хотите Вас, может скомпилировать простой тест:
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;
}
Компиляция:
gcc -o isawhat isawhat.c
Затем, например:
$ ./isawhat | sed 's/word/world/'
Ширина измеряется в столбцах. Один столбец является одним символом. Это начинается с 80, затем проверьте, установлены ли СТОЛБЦЫ переменной среды и содержат допустимый интервал, который не больше затем SIZE_MAX (Который является иждивенцем дуги - Ваш терминал никогда не будет настолько широк (по крайней мере еще)).
Попробуйте, например. echo $COLUMNS
. Это по всей вероятности отражает число столбцов, которые Вы имеете в наличии в окне. Поскольку окно изменено - это обновляется. Это по всей вероятности также сбрасывается различными командами.
Один способ установить его немного тяжелее stty
. Например. stty columns 60
. Использовать stty -a
просмотреть все (человек stty). Забавная часть программного обеспечения.
Если скомпилировано в нем также запрашивают для столбцов ioctl (), Размер окна обнаруживают.. Путем передачи filenumber для stdout к ioctl
и передача запроса TIOCGWINSZ структура winsize
будьте заполнены числом столбцов.
Это может также быть продемонстрировано простым c-кодом:
Скомпилируйте, выполните и измените размер окна. Должен обновить. Ctrl+C для выхода.
#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;
}
Когда произведенный направлен в дескриптор файла кроме терминала (таким образом канал или файл, и т.п.), ls
ведет себя, как будто это было вызвано как ls -1
.