Я использую Ubuntu и могу вручную изменить цвет приглашения оболочки bash на зеленый с помощью
export PS1="\e[0;32m[\u@\h \W]\$ \e[m"
Однако я хочу, чтобы цвет подсказки оболочки автоматически менялся, когда я открываю новый терминал или вкладку , Я знаю, что базовый tty TERM имеет 16 цветов, и нормально поворачивать цвета, если открыто более 16 терминалов. Будет ли решение работать, когда я подключусь через Putty, tmux или screen.
Моя идея - написать сценарий оболочки и поместить его в .bashrc, который определяет новый сеанс терминала пользователь открыл и увеличил глобальный счетчик с \e[0;31m[ до \e[0;47m[. Как определить количество открытых терминалов пользователем?
В ситуации с одним пользователем, если взять пример xterm, мы можем просто подсчитать количество pids из xterm; xterm создает отдельный pid для каждого окна. gnome-terminal однако запускает один pid, но хорошей новостью является то, что он создает дочерний процесс для каждого окна и / или вкладки. мы можем восстановить эти дочерние процессы с помощью команды:
pgrep -P <pid_of_gnome-terminal>
Однако есть несколько осложнений:
Считая ваш вопрос, мы можем предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -variable, но это может не соответствовать зарегистрированному в данный момент пользователю $DISPLAY. В многопользовательской ситуации pids, принадлежащие терминальному приложению (или который), необязательно относятся к текущему $DISPLAY. Нам нужно отделить только соответствующие pids и child-pids. В Unity (15.10 или ниже), если второй пользователь входит в систему, запускается дополнительный процесс (gnome-pty-helper), который появляется как дочерний процесс в gnome-terminal, но процесс (очевидно) не имеет окна или вкладки. В Mate процесс все равно существует.Чтобы подсчитать количество вкладок и / или окон терминального приложения, нам необходимо:
Читая ваш вопрос, мы может предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -variable, но это может не соответствовать зарегистрированному пользователю $DISPLAY. Из запущенных процессов отделяются только соответствующие pids, работающие на этом $DISPLAY В многопользовательской ситуации pids, принадлежащие терминальному приложению (или который), необязательно относятся к текущему $DISPLAY. Нам нужно отделить только соответствующие pids и child-pids.Это может быть очень хорошо написано, чтобы надежно найти количество открываемых в настоящее время окон и / или вкладок.
В приведенном ниже сценарии целевое приложение терминала используется в качестве аргумента. Скрипт работает на многих терминалах, на которых я тестировал его. Исключением является Tilda в этот момент.
Пример
Из запущенных процессов отделяются только соответствующие pids, работающие на этом $DISPLAY [!d18 ]
Команда:
/path/to/get_terms.sh gnome-terminal
выходы:
3
, а
/path/to/get_terms.sh xterm
[d36 ]: 2
#!/bin/bash
terminal=$1
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
# check if gnome-pty-helper runs (starts when multiple users are logged in)
ptpid=$(pgrep gnome-pty-helpe)
# get number of child- procs
let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )"
# if pty-helper runs, correct the number of child procs
if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
let "n_terms = $orig-1"; else let "n_terms = $orig"
fi
# if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi
Считая ваш вопрос, мы можем предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -переменная, но это может не соответствовать зарегистрированному пользователю $DISPLAY.
/path/to/get_terms.sh <terminal_application>
Способ awk:
who | awk 'BEGIN{count=0}{ if(NR!=1){count++} }END{print count}'
Объяснение:
В команде выше 1 liner awk используется, чтобы найти счетчик терминалов. Внутри программы awk он просто проверяет количество строк, возвращаемых командой who - 1.
Простым способом может быть просто запуск System Monitor (если он начат с терминала, вы должны написать gnome-system-monitor), а на вкладке «Процессы» упорядочить запущенные процессы по имени и подсчитать количество вхождений Bash в листинг (они будут все вместе, если вы организуете по имени, поэтому их легко подсчитать).
Обратите внимание, что вы должны искать Bash, а не для Gnome Terminal, если хотите видеть количество открытых терминалов пользователем. Как только вы откроете терминал Gnome Terminal, также появится в списке «Процессы», но останется только одним, даже если открыто больше терминалов. Кнопка «Просмотр» в System Monitor позволяет вам установить, какие процессы увидеть, например. Все процессы / пользовательские процессы / активные ...