Как разделить терминал больше чем на одно “представление”?

Что я делаю, если это возможно, должен подать код выхода от foo в bar. Например, если я знаю это foo никогда не продолжает линию только с цифрами, затем я могу просто лавировать на коде выхода:

{ foo; echo "$?"; } | awk '!/[^0-9]/ {exit($0)} {…}'

Или если я знаю что вывод от foo никогда не содержит строку только с .:

{ foo; echo .; echo "$?"; } | awk '/^\.$/ {getline; exit($0)} {…}'

Это может всегда делаться, если существует некоторый способ добраться bar работать над всеми кроме последней строки и передавать последнюю строку как ее код выхода.

Если bar сложный конвейер, чей производит Вас, не нуждаются, можно обойти часть его путем печати кода выхода на другом дескрипторе файла.

exit_codes=$({ { foo; echo foo:"$?" >&3; } |
               { bar >/dev/null; echo bar:"$?" >&3; }
             } 3>&1)

После этого $exit_codes обычно foo:X bar:Y, но это могло быть bar:Y foo:X если bar выходы прежде, чем считать весь его вход или если Вы неудачны. Я думаю, что записи к каналам до 512 байтов являются атомарными на всех нельдах, таким образом, foo:$? и bar:$? части не будут смешаны, пока строки тега находятся под 507 байтами.

Если необходимо получить вывод от bar, это становится трудным. Можно объединить методы выше путем принятия мер к выводу bar чтобы никогда содержать строку, которая похожа на признак кода выхода но это действительно становится трудным.

output=$(echo;
         { { foo; echo foo:"$?" >&3; } |
           { bar | sed 's/^/^/'; echo bar:"$?" >&3; }
         } 3>&1)
nl='
'
foo_exit_code=${output#*${nl}foo:}; foo_exit_code=${foo_exit_code%%$nl*}
bar_exit_code=${output#*${nl}bar:}; bar_exit_code=${bar_exit_code%%$nl*}
output=$(printf %s "$output" | sed -n 's/^\^//p')

И, конечно, существует простая опция использования временного файла для хранения состояния. Простой, но не настолько простой в производстве:

  • Если существует несколько сценариев, работающих одновременно, или если тот же сценарий использует этот метод в нескольких местах, необходимо удостовериться, что они используют различные временные имена файлов.
  • Создание временного файла надежно в общем каталоге трудно. Часто, /tmp единственное место, где сценарий, несомненно, сможет записать файлы. Использовать mktemp, который не является POSIX, но доступный на всех серьезных нельдах в наше время.
foo_ret_file=$(mktemp -t)
{ foo; echo "$?" >"$foo_ret_file"; } | bar
bar_ret=$?
foo_ret=$(cat "$foo_ret_file"; rm -f "$foo_ret_file")

279
23.06.2012, 03:47
10 ответов

Можно выполнить в нем screen оконечный мультиплексор.

  • Разделять вертикально: ctrla затем |.
  • Разделять горизонтально: ctrla затем S (верхний регистр').
  • Не разделять: ctrla затем Q (верхний регистр 'q').
  • Переключаться от одного до другого: ctrla затем вкладка

Примечание: После разделения необходимо войти в новый регион и запустить новую сессию через ctrla затем c, прежде чем можно будет использовать ту область.

РЕДАКТИРОВАНИЕ, основное экранное использование:

  • Новый терминал: ctrla затем c.
  • Следующий терминал: ctrla затем располагают с интервалами.
  • Предыдущий терминал: ctrla затем возвращаются.
  • Терминал N'th ctrla затем [n]. (работы для n ∈ {0,1 … 9})
  • Переключатель между терминалами с помощью списка: ctrla затем "(полезный, когда больше чем 10 терминалов)
  • Отправьте ctrla на базовый терминал ctrla затем a.
363
27.01.2020, 19:26
  • 1
    Tmux также, делает это, и много терминальных программ разделили представления и вкладки. –  Shawn J. Goff 15.02.2011, 18:51
  • 2
    @AaronNewton ctrl+a затем выпустите все затем shift+s (не знайте для Caps Lock, мой отключен) –  shellholic 05.12.2011, 14:43
  • 3
    Ctrl A Shift S разделяет экран, затем Ctrl A Tab переключатели к другому разделению, и Ctrl A c создает подсказку удара. Должен был там так или иначе выполнить эти команды автоматически при запуске screen таким образом, мы не должны выполнять команды все время. –  Michael Butler 19.09.2012, 17:22
  • 4
    Который версия экрана для вертикального разделения? Версия, которую я установил, 4.00.03, который совпадает с последней доступной загрузкой с от всех зеркал, которые я проверил. –  Brian Vandenberg 14.10.2013, 23:53
  • 5
    Как я делаю одно из своих вертикальных окон шире, чем другой? Я хочу как 30|30|40 разделение. –  mpen 19.03.2015, 00:58

Если Вы хотите программу, которая просто разделяет терминал ¹, существует splitvt. Существуют программы, которые разделяют терминал и делают много другого материала кроме того, такого как Экран, Tmux, Emacs, …

¹ Это - терминал, который Вы разделяете, не оболочка.

21
27.01.2020, 19:26
  • 1
    +1, положительная сторона у того, как терминал - то, что действительно разделяется. –  Justin Ethier 21.02.2011, 16:37

Как упомянуто в комментариях, помимо экрана, другой хороший оконечный мультиплексор является tmux. Можно обратиться к руководству для полного описания и управлять ссылкой. Некоторые основные операции для начала работы:

  • Разделение экрана вертикально: Ctrlb и Shift5
  • Разделение экрана горизонтально: Ctrlb и Shift"
  • Переключатель между областями: Ctrlb и o
  • Близко текущая область: Ctrlb и x

Можно достигнуть более сложных макетов путем разделения областей. У Вас может также быть несколько окон с областями и переключателем между ними.

  • Создайте окна: Ctrlb и c
  • Переключатель к следующему окну: Ctrlb и n
  • Переключатель к предыдущему окну: Ctrlb и p
  • Уничтожьте текущее окно: Ctrlb и Shift7
65
27.01.2020, 19:26
  • 1
    Обратите внимание, что можно изменить префикс tmux на что-то более легкое для достижения, чем <C-b>. –   07.04.2013, 15:04

Кроме превосходных предложений на Screen и Tmux при использовании своего рода менеджера окон, можно интересоваться Терминатором, которого можно разделить горизонтально или вертикально виды плюс вкладки, и больше... вот список функций, взятых с веб-сайта автора:

  • Терминалы расположения в сетке
  • Вкладки
  • Переупорядочение перетаскивания терминалов
  • Много сочетаний клавиш
  • Сохраните несколько разметок и профилей через предпочтительного редактора GUI
  • Одновременный ввод произвольным группам терминалов

Взгляните к снимкам экрана на стройплощадку.

Самый важный можно объединить Терминатора с Screen/Tmux.

19
27.01.2020, 19:26
  • 1
    Обратите внимание, что использование разделений Терминатора будет менее удобным когда copypasting между двумя окнами Вашего редактора. –  gb. 07.08.2012, 05:00
  • 2
    Можно отредактировать несколько областей сразу после группировки областей (или просто выбор внезапно), и можно отредактировать ярлыки для области, переключающейся точно также. Я имею ctrl-shift-h/j/k/l для перемещения между областями и ctrl-(сдвиг) - вкладка для переключения между вкладками, это просто работает потрясающее. –  sjas 13.02.2016, 21:57
  • 3
    , хороший, мы можем нажать на них, чтобы сфокусироваться; но наклон все еще находит способ равномерно распределить терминалы в сетке, это - просто путаница, которая будет зафиксирована вручную, также я должен динамично добавить терминалы, поэтому обновить их в равномерно распределенной сетке, какой-либо идее? –  Aquarius Power 30.04.2016, 01:24

Попытка tmux (Оконечный мультиплексор):

tmux screenshot

И понять различие между session, window и pane: tmuxnestings

112
27.01.2020, 19:26

Попробуйте вертикальное разделение за экран GNU

Этот патч обеспечивает вертикальную функцию разделения текущих выпусков Экрана GNU. Функция разработана для функционирования таким же образом как существующую команду разделения экрана, но деление регионов вертикально вместо горизонтально. Обе формы разделений могут использоваться вместе в любой желаемой комбинации/количестве/порядке. Что-то подобное намечено для появления на Экране 4.1 GNU скоро и уже доступно в CVS на этот поток списка рассылки (и был включен в пакеты экрана Debian и Ubuntu, запускающиеся с 4.0.3-10). Кроме того, недавний проект под названием ScreenWM специально разработан для работы с vsplit-исправленным экраном (проверьте его!).

2
27.01.2020, 19:26
  • 1
    Чтобы быть точнее, Ctrl+| разделения screen в Ubuntu сразу. –  Jonatan Öström 23.10.2016, 21:17

Используйте терминатор .

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

Это единственный терминальный мультиплексор, в котором копирование и вставка правильно работают из панелей вашего окна.

Обновление: tilix - это альтернатива терминатора , которая почти полностью соответствует терминатору (и где копипастинг тоже работает правильно). Оценив его, я все еще придерживаюсь терминатора , однако из-за более удобной обработки вкладок и более простой настройки (из моего POV).

7
27.01.2020, 19:26

Konsole для KDE имеет встроенную функцию :

  • Ctrl + ( для разделения просмотра влево / вправо

  • Ctrl + ) для разделения просмотра сверху / снизу

  • Shift + Tab будет циклически переключаться между разделенными видами

  • Shift + стрелка влево / Стрелка вправо будет переключать текущий вид между вкладками / видами

  • Ctrl + Shift + X , чтобы закрыть текущий вид

9
27.01.2020, 19:26

Guake + Byobu

Я счастливый пользователь Guake с Byobu внутри, который по умолчанию использует tmux (возможно лучше чем screen) в качестве бэкенда.

Три шага

  1. Установите их (PPA не нужны на Ubuntu/Debian, проверьте для других дистрибутивов)

    sudo apt install guake byobu
    
  2. Добавьте его в доступные оболочки (как я говорил в этом выпуске Guake на Github):

    which byobu | sudo tee -a /etc/shells
    
  3. В настройках Guake (guake-prefs) выберите Byobu в качестве интерпретатора по умолчанию:

    screenshot

Optionals

  1. Guake

    1. Снимите галочку с "Show tab bar", поскольку вы будете использовать Byobu для этого:
      image
    2. Если ярлык не работает, попробуйте отключить в Guake те, которые могут мешать (в моем случае это был Ctrl+F2 для вертикального разделения): screenshot
  2. Byobu

    1. Изучите сочетания клавиш с помощью Shift+F1 или этого отличного скринкаста.
    2. Узнайте доступные команды терминала byobu с помощью apropos byobu
    3. Для использования клавиш Fn в Midnight Commander используйте Alt+, или Shift+F12, чтобы отключить F-клавиши byobu.

screenshot

6
27.01.2020, 19:26

Vimтакже может использоваться в качестве грубого оконечного мультиплексора:

:terminalоткрывает терминал с горизонтальным разделением,
:vertical terminalоткрывает терминал с вертикальным разделением.

Как обычно, команды можно назначать сочетаниям клавиш.

1
07.11.2020, 08:23

Теги

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