Чтение нескольких строк в Bourne Shell

Да, с помощью команды list-panes.

tmux list-panes -a -F '#D #{pane_tty}'
%0 /dev/pts/9
%1 /dev/pts/10

Вы можете использовать это, чтобы перечислить многое другое:

tmux list-panes -a -F '#D #T #{pane_tty} #{pane_current_command} #{pane_current_path}'
tmux list-windows -a -F '#{window_id} #W #{window_layout}' | while read w i; do echo $w $i; tmux list-panes -t "$w" -F "  #D #{pane_tty} #T #{pane_current_command}"; done

Посмотрите раздел ФОРМАТЫ на справочной странице tmux.

1
11.05.2020, 21:22
1 ответ

При использовании правой стороны канала существуют некоторые ограничения.

Я изменил ваш код, чтобы переменные не устанавливались перед использованием, и немного сжал его.

#! /bin/sh

unset firstline secondline
printf '%s\n%s\n' line1 line2 > myfile

cat myfile | { read firstline; read secondline
               echo "internal 1: $firstline"     # "line1" in most shells
               echo "internal 2: $secondline"    # "line2" in most shells
             }

echo "Outside 1: $firstline"     # "line1" in ksh, zsh (even called as sh).
                                 #  Empty in sh, bash, mksh, dash, ash, yash.
echo "Outside 2: $secondline"    # "line2" in ksh, zsh.
                                 # Same as above for other shells.

Внутренние элементы составной команды {...}имели значения, внешние(Outside)во многих случаях были пустыми (, особенно POSIX, портативный вариант ).

Только если вы установите shopt -s lastpipe, вы получите bash, чтобы сохранить значения справа от символа вертикальной черты.И ksh (93 ), и zsh сохраняют считанные значения по умолчанию.

Итак, проблема состоит в том, чтобы избежать символа вертикальной черты |, ну, в данном случае это очень просто. Либо <file {... }, либо {...} <file, и вы настроены на переносимость значений переменных.

#! /bin/sh

unset firstline secondline
printf '%s\n%s\n' line1 line2 > myfile

{ read firstline; read secondline
  printf '%s\n' "internal 1: $firstline"     # "line1" in most shells
  printf '%s\n' "internal 2: $secondline"    # "line2" in most shells
} < myfile

printf '%s\n' "Outside 1: $firstline"          # "line1" in most shells.
printf '%s\n' "Outside 2: $secondline"         # "line2" in most shells.

Эта работа во всех протестированных оболочках, кроме старой оболочки Bourne (в ней отсутствует структура {...}, которая работает в настоящей оболочке, обходной путь становится более сложным, не стоит времени, прочитайте ответ @schily для этого ).

1
28.04.2021, 23:15

Теги

Похожие вопросы