Направления обрабатываются слева направо.
ls > dirlist 2>&1
Заставьте оболочку, которая в конечном итоге превратится в ls, выполнить следующие системные вызовы (проверка ошибок опущена для краткости).
/* Handle > dirlist */
int temp_fd = open("dirlist",O_WR); /* Open dirlist for output */
dup2(temp_fd, 1); /* Make file descriptor 1 (stdout) point to dirlist */
close(temp_fd); /* Don't need this other file descriptor for dirlist */
/* Handle 2>&1 */
dup2(1,2); /* Make fd 2 be a copy of fd 1, which points to dirlist */
То есть сначала изменяется fd 1, а затем fd 2.
И наоборот, ls 2>&1 > dirlist делает
/* Handle 2>&1 */
dup2(1,2); /* Make fd 2 be a copy of fd 1, the original stdout */
/* Handle > dirlist */
int temp_fd = open("dirlist",O_WR); /* Open dirlist for output */
dup2(temp_fd, 1); /* Make file descriptor 1 (stdout) point to dirlist */
close(temp_fd); /* Don't need this other file descriptor for dirlist */
Другой способ посмотреть на это - это просто присваивания. Первоначально fd1=initial_stdout, затем
/* ls > dirlist 2>&1 */
fd1=to_dirlist
fd2=fd1 (i.e. to_dirlist)
/* ls 2>&1 > dirlist */
fd2=fd1 (i.e. initial_stdout)
fd1=to_dirlist.
Или вы можете сказать копирование по значению
, а не копирование по ссылке
.
Если предположить, что clear
действительно очищает экран, то показанный сценарий сам по себе не создаст первый снимок экрана. Если у вас был дополнительный процесс, добавляемый в /tmp/temp_script.log
, то это могло что-то сделать ...
С другой стороны, если ваш терминал не очищает экран, это часть проблемы. Возможно, эта цветная линия является подсказкой, из которой вы запустили сценарий, и вы можете оставить ее в верхней части экрана:
TERM
на подходящее значение, которое соответствует описание терминала. printf '\033[2H\033[J'
или
tput cup 1 0 tput ed
Другая часть проблемы заключается в том, что три строки печатаются повторно, спускаясь вниз по экрану. Вы можете изменить это, чтобы переместить курсор туда, где вы хотите напечатать счетчик, например,
printf '\033[4H'
или
tput cup 3 0
Собирая их вместе, ваш сценарий может выглядеть следующим образом (и с использованием printf
, поскольку что-то кажется неправильным с вашим TERM
и / или описанием терминала):
#!/bin/bash if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi #result=`sensors -A` count=0 printf '\033[2H\033[J' keypress='' echo "linha 1" echo "Linha 2 while [ "x$keypress" = "x" ]; do let "count++" printf '\033[4H' echo $count sleep 1 keypress="`cat -v`" done if [ -t 0 ]; then stty sane; fi exit 0
Дополнительная литература: