Что я делаю, если это возможно, должен подать код выхода от 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")
Можно выполнить в нем screen
оконечный мультиплексор.
Примечание: После разделения необходимо войти в новый регион и запустить новую сессию через ctrla затем c, прежде чем можно будет использовать ту область.
РЕДАКТИРОВАНИЕ, основное экранное использование:
Если Вы хотите программу, которая просто разделяет терминал ¹, существует splitvt. Существуют программы, которые разделяют терминал и делают много другого материала кроме того, такого как Экран, Tmux, Emacs, …
Как упомянуто в комментариях, помимо экрана, другой хороший оконечный мультиплексор является tmux. Можно обратиться к руководству для полного описания и управлять ссылкой. Некоторые основные операции для начала работы:
Можно достигнуть более сложных макетов путем разделения областей. У Вас может также быть несколько окон с областями и переключателем между ними.
Кроме превосходных предложений на Screen и Tmux при использовании своего рода менеджера окон, можно интересоваться Терминатором, которого можно разделить горизонтально или вертикально виды плюс вкладки, и больше... вот список функций, взятых с веб-сайта автора:
Взгляните к снимкам экрана на стройплощадку.
Самый важный можно объединить Терминатора с Screen/Tmux.
ctrl-shift-h/j/k/l
для перемещения между областями и ctrl-(сдвиг) - вкладка для переключения между вкладками, это просто работает потрясающее.
– sjas
13.02.2016, 21:57
Попытка tmux (Оконечный мультиплексор):
И понять различие между session
, window
и pane
:
tmux
ресурсы справки: введение, конфигурация, краткая информация и шпаргалка.
– not2qubit
10.12.2017, 12:49
Попробуйте вертикальное разделение за экран GNU
Этот патч обеспечивает вертикальную функцию разделения текущих выпусков Экрана GNU. Функция разработана для функционирования таким же образом как существующую команду разделения экрана, но деление регионов вертикально вместо горизонтально. Обе формы разделений могут использоваться вместе в любой желаемой комбинации/количестве/порядке. Что-то подобное намечено для появления на Экране 4.1 GNU скоро и уже доступно в CVS на этот поток списка рассылки (и был включен в пакеты экрана Debian и Ubuntu, запускающиеся с 4.0.3-10). Кроме того, недавний проект под названием ScreenWM специально разработан для работы с vsplit-исправленным экраном (проверьте его!).
Должен быть доступен через ваш любимый менеджер пакетов, если вы используете основной дистрибутив.
Это единственный терминальный мультиплексор, в котором копирование и вставка правильно работают из панелей вашего окна.
Обновление: tilix
- это альтернатива терминатора
, которая почти полностью соответствует терминатору (и где копипастинг тоже работает правильно). Оценив его, я все еще придерживаюсь терминатора
, однако из-за более удобной обработки вкладок и более простой настройки (из моего POV).
Konsole для KDE имеет встроенную функцию :
Ctrl + ( для разделения просмотра влево / вправо
Ctrl + ) для разделения просмотра сверху / снизу
Shift + Tab будет циклически переключаться между разделенными видами
Shift + стрелка влево / Стрелка вправо будет переключать текущий вид между вкладками / видами
Ctrl + Shift + X , чтобы закрыть текущий вид
Я счастливый пользователь Guake с Byobu внутри, который по умолчанию использует tmux
(возможно лучше чем screen
) в качестве бэкенда.
Установите их (PPA не нужны на Ubuntu/Debian, проверьте для других дистрибутивов)
sudo apt install guake byobu
Добавьте его в доступные оболочки (как я говорил в этом выпуске Guake на Github):
which byobu | sudo tee -a /etc/shells
В настройках Guake (guake-prefs
) выберите Byobu в качестве интерпретатора по умолчанию:
Guake
Byobu
apropos byobu
Vim
также может использоваться в качестве грубого оконечного мультиплексора:
:terminal
открывает терминал с горизонтальным разделением, :vertical terminal
открывает терминал с вертикальным разделением.
Как обычно, команды можно назначать сочетаниям клавиш.
ctrl+a
затем выпустите все затемshift+s
(не знайте для Caps Lock, мой отключен) – shellholic 05.12.2011, 14:43Ctrl A Shift S
разделяет экран, затемCtrl A Tab
переключатели к другому разделению, иCtrl A c
создает подсказку удара. Должен был там так или иначе выполнить эти команды автоматически при запускеscreen
таким образом, мы не должны выполнять команды все время. – Michael Butler 19.09.2012, 17:22