И не говори " $TERM
" - это всегда xterm
.
Как bash
скрипт может сказать, в каком терминале он работает, в частности, это iTerm, Terminal.app или на самом деле xterm?
Я спрашиваю, потому reset
что не работает из коробки на Terminal.app и iTerm2. iTerm2, однако, распознает escape-последовательность для выполнения перезагрузки терминала ( \x1b]50;ClearScrollback\x07
), и если бы я мог ее обнаружить, я мог бы переопределить reset
псевдоним, который делает правильные вещи. На самом деле, Terminal.app не хватает последовательности сброса, и люди прибегают к нелепым хакерским действиям, чтобы взломать это .
Моя конечная цель здесь - reset
работать одинаково, работаю ли я на OS X или Linux, работаю локально или удаленно через SSH. (Я не хочу пытаться вспомнить, какие именно, и это полезно делать reset && command-that-outputs-a-bunch
и начинать работу.) Terminal.app и iTerm вносят рывок в этот план из-за reset
неправильной реализации .
Это означает, что просто переопределение reset
не совсем так: если я на машине с Linux, он должен знать, использую ли я gnome-terminal
или iTerm, чтобы отправить правильную escape-последовательность.
Есть ли способ (даже если мне нужно ioctl
) спросить терминал, что это на самом деле ?
¹ Для целей этого вопроса сброс должен очистить экран, сбросить курсор и стереть буфер прокрутки.
источник
Terminal.app
настройки, вкладку терминала и установите для строк прокрутки значение 0? Отключает ли это какой-либо текст над текущей строкой или что-нибудь над верхней частью экрана? Я знаю, это не совсем то, что вы просили, стоит попробовать.reset
, так как это то, что знают мои пальцы.reset
команда очистит содержимое прокрутки в эмуляторе терминала, но это не гарантировано, потому что прокрутка назад является специфичной для эмулятора терминала функцией, а не часть терминала. Тем не менее, терминал поддерживает расширение escape-последовательности ED (Erase in Display) для удаления прокрутки назадESC [ 3 J
. Вы можете очистить экран, а затем использовать это, например,reset && printf '\e[3J’
xterm
(сквознымTERM=xterm
), я бы ожидал, что вы эмулируете расширенный набор XTerm, который очищает его прокрутку при перезагрузке. (Точно так же, как если бы вы послали escape-последовательность для «blue», вы бы ожидали синего цвета.) Конечно, мой xterm говорит мне об этомErase is backspace.
, что, я благодарен, больше ничего не делает; это просто раздражает.Ответы:
Использование
$TERM_PROGRAM
.iTerm устанавливает его
iTerm.app
, а Terminal.app -Apple_Terminal
.источник
sshd_config
,AcceptEnv
вероятно. Так как это (ваша оболочка работает на другом хосте, чем тот, на котором работает ваш терминал) очень важная информация, она действительно должна быть частью вопроса.$TERM
не имеет никакого отношения к эмулятору терминала, работающему в данный момент, это просто ваш терминал по умолчанию и может быть установлен на что угодно. Чтобы получить имя эмулятора терминала, который вы используете, вы можете использоватьps
для получения PID родительского процесса вашей текущей оболочки.ПРИМЕЧАНИЕ: следующее не будет работать в OSX, но должно работать нормально в Linux
PID вашего текущего процесса оболочки является
$$
. Оттуда вы можете использовать,ps
чтобы показать дерево процессов и распечатать PID родителя вашего текущего сеанса оболочки:Затем вы можете передать этот PID
ps
и сказать ему напечатать имя команды:Это будет усекать имя, вам должно хватить, чтобы понять его, но это может быть плохо для сценариев. Чтобы получить полное имя, вы можете попробовать
Вот что я получаю в своей системе, используя несколько разных терминалов:
terminator
gnome-terminal
xterm
источник
ps: illegal option -- f
-
перед должно работать в соответствии с OSXman ps
.$2
, PPID есть$3
), а родительский процесс оболочки может бытьlogin
(в зависимости от конфигурации терминала) с разными параметрами. Тем не менее, его родительский процессTerminal
.--no-headers
не существует, вам нужно что-то вродеtail -n1
. И поскольку все процессы с пользовательским интерфейсом имеют аргумент-psn_0_...
,awk '{print $NF}'
тоже не работает.Вот портативный способ получить имя или путь родительского процесса:
iTerm 2:
гном-терминал в Ubuntu:
Terminal.app:
Обратите внимание, что если Terminal.app настроен на открытие новых оболочек с помощью оболочки входа по умолчанию, родительский процесс оболочки - это
login
не терминал.comm
Колонна является полным путем команды в OS X и имя команды усечен до 15 символов в реализации PROCPS в Linux.источник
login
- настроил ли я свой профиль некоторое время назад для запуска командыlogin -fp danielbeck
?