Почему делает xterm/bash переход на новую строку даже tho, окно является большим для установки команде

Если Вы смотрите на стандарт ASCII ANSI, более низкая часть набора символов (первые 32) резервируются "управляющие символы" (иногда называемый "escape-последовательностями"). Это вещи как символ NUL, Жизненный Канал, Возврат каретки, Вкладка, Звонок, и т.д. Подавляющее большинство может быть эмулировано путем нажатия клавиши Ctrl в сочетании с другим ключом.

27-е (десятичное число) или \033 восьмеричная последовательность, или 0x1b шестнадцатеричной последовательностью является Escape-последовательность. Они - все представления той же управляющей последовательности. Различные оболочки, языки и инструменты относятся к этой последовательности по-разному. Его последовательность Ctrl является Ctrl-[, следовательно иногда будучи представленным как ^[, ^ будучи стенографией для Ctrl.

Можно ввести последовательности управляющего символа, поскольку сырые данные упорядочивают на командной строке путем продолжения их Ctrl-v. Ctrl-v к большинству оболочек и программ останавливает интерпретацию следующего сочетания клавиш и вместо этого вставляет в его необработанную форму. Если Вы сделаете это или с Клавишей выхода или с Ctrl-v, то это отобразится на большинстве оболочек как ^[. Однако, хотя эта последовательность будет интерпретироваться, она не вырежет и вставит легко и может быть уменьшена до не последовательности управляющего символа при обнаружении определенными протоколами или программами.

Для обхождения этого, чтобы помочь использовать определенные утилиты представляют "необработанную" последовательность любой с \033 (восьмеричной ссылкой), преобразуйте ссылку в шестнадцатеричную систему \x1b или ссылкой специального символа \e . Это является почти таким же в пути который \t интерпретируется как Вкладка - который между прочим может также быть введен через Ctrl-i, или \n как новая строка или клавиша Enter, которая может также быть введена через Ctrl-m.

Таким образом, когда Gilles говорит:

27 = 033 = 0x1b = ^ [= \e

Он говорит что десятичный ASCII 27, восьмеричные 33, шестнадцатеричное число 1b, Ctrl-[и \e все равны, он подразумевает, что они все обращаются к тому же самому (семантически).

Когда Demizey говорит

^ [является просто представлением ESCAPE, и \e интерпретируется как фактический Символ ESC

Он имеет в виду семантически, но если Вы нажимаете Ctrl-v Ctrl-[это - точно то же как \e, вставленную последовательность сырых данных будут, скорее всего, рассматривать тот же путь, но это не всегда гарантируется, и таким образом, это рекомендовало использовать программно более портативный \e или 0x1b или \033 в зависимости от используемого языка/оболочки/утилиты.

4
11.01.2015, 23:35
3 ответа

Именованный канал может работать на вас. Только немного больше работы вы можете получить один надежно и без необходимости настройки ловушки или подобные для обработки очистки файловой системы после - вы просто сделать очистку заранее.

pipe=/tmp/$$pipe log=mylog.txt
mkfifo "$pipe"; exec 3<>"$pipe"
{ rm "$pipe"; tee "$log"; } <&3 >/dev/tty &
pipe=$!; exec >&3 3>&-

Там. С этого момента все выходные данные сценария записываются в (используемый) именованный канал, который считывается задним процессом tee . Специальный файл именованного канала уже удален из файловой системы, поэтому его не требуется очищать позже, и единственными оставшимися ссылками на него являются дескрипторы файлов, назначенные сценарию stdout и tee stdin .

При этом было бы целесообразно установить хотя бы одну ловушку :

trap "kill PIPE $pipe" 0

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

Если вы столкнетесь с проблемами буферизации - что не должно быть проблемой, я думаю, поскольку tee имеет открытую строку на /dev/tty - вы можете попытать счастья, позвонив tee через stdbuf . stdbuf "s man page специально хеджирует свои ставки, где tee обеспокоен, хотя - он отмечает tee как приложение, которое, вероятно, будет корректировать свои собственные буферы после вызова - но более позитивно относится к взаимодействию, чем для dd в любом случае.

-121--105488-

Переменные среды не должны иметь пустого имени, поэтому многие утилиты их не поддерживают.

Команда env из coreutils GNU поддерживает установку переменной среды с пустым именем, но не отменяет ее установку. Это жучок.

$ env '=wibble' env |grep wibble                                 
=wibble
$ env '=wibble' env -u '' env
env: cannot unset `': Invalid argument

Общие оболочки также не могут отменить установку пустого имени. Это нормально, так как пустое имя не должно использоваться в качестве переменной среды и не может использоваться в качестве переменной оболочки. Зш - единственный багги в жребии: он делает вид, что делает работу, но на самом деле ничего не делает.

$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: `': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset:  is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble

Python, как вы заметили, выходит из строя, когда находит пустое имя переменной среды .

У Perl такой проблемы нет, поэтому это может быть решением для вас. Следует отметить, что для изменения среды необходимо выполнить новую оболочку и использовать внешний процесс.

perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"
-121--111606-

Вероятно, это readline . Добавьте

set horizontal-scroll-mode on

в конфигурацию readline (обычно ~/.inputrc ) и перезапустите оболочку или перечитайте конфигурацию (обычно с помощью Ctrl + X Ctrl + R ).

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

4
27.01.2020, 20:57

Таким образом, как указывает @ muru в комментариях, не кажется, что существует простой способ сопряжения пти, созданной для вас, только с оболочкой. Я управлял всем этим, но часть unlockpt () . В соответствии с чем-то, что я прочитал здесь , возможно, есть некоторые параметры компиляции времени в ядре для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал что-то другое.

На самом деле мне не нужен grantpt () . В соответствии с приведенным здесь описанием все, что он делает, это изменяет UID/GID для файла устройства /dev/pts/[ num] . Но согласно человек монтирует есть более простые способы справиться с этим. Ниже приведены некоторые опции монтирования devpts :

  • uid = value и gid = value
    • . Это устанавливает для владельца или группы вновь созданных PTY указанные значения. Если ничего не указано, для них будут установлены UID и GID процесса создания. Например, если существует группа tty с GID 5, то gid = 5 приведет к тому, что вновь созданные PTY будут принадлежать группе tty .

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

  • ptmxmode = value
    • Наборов режим для нового узла устройства ptmx в файловой системе devpts .
    • При поддержке нескольких экземпляров devpts (см. опцию newinstance выше) каждый экземпляр имеет частный узел ptmx в корне devpts файловой системы (обычно /dev/pts/ptmx ) .
    • Для совместимости со старыми версиями ядра по умолчанию используется режим нового узла ptmx 0000 . ptmxmode = value указывает более полезный режим для узла ptmx и настоятельно рекомендуется, когда задан параметр newinstance .

Несмотря на то, что это сработало бы без этого, мне понравилась идея и я установил ее на 0640 , как рекомендовано в документации по ядру . Ссылка kernel doc, по пути, развивает опцию newinstance mount - что довольно круто и в основном позволяет получить отдельно разнесенную по имени группу ptys на /dev/ptmx mount.

В любом случае, так что что-то еще было в основном:

mount -o remount,newinstance,gid=5,ptmxmode=0640 /dev/pts
mount --bind /dev/pts/ptmx /dev/ptmx

... как ядро документы рекомендуют - см. ссылку о том, почему. Я также сделал эффект вышеуказанных команд постоянным, добавив пару строк в мой /etc/fstab .

И...

<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
        if(unlockpt(0)) return 2;
        char *ptsname(int fd);
        printf("%s\n",ptsname(0));
        return argc - 1;
}
C

Которая просто компилирует крошечную маленькую программу C, которая пытается вызвать unlockpt () на своем stdin и если успешно напечатает имя вновь созданной и разблокированной pty в stdout или в противном случае молча возвращает 2.

Как только это было сделано, я мог создать свои собственные экранированные процессы, такие как:

exec 3<>/dev/ptmx

...чтобы получить главную сторону fd в текущей оболочке, то...

(setsid -c "$0" -i 2>&1|tee log) <>"$(./pts <&3)" 3>&- >&0 &

На другом конце псевдотерминала в фоновом режиме выполняется интерактивная оболочка. Он интерпретирует все, что напечатано на > & 3 , как пользовательский ввод.

mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$
mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$ hey
$ 

Который в основном связывает меня фоновый, протоколированный, интерактивный интерпретатор (или что-либо еще, что я могу хотеть, чтобы запустить на этих) ala экран без столько накладных расходов и на любой файл дескриптор я выбираю.

Ведущая сторона fd, принадлежащая моей текущей оболочке, является единственным средством обслуживания входа ведомой стороны и может быть записана только моим текущим процессом оболочки (и его дочерними) . Я могу связаться с другой стороной, написав в > & 3 , и я могу либо читать из того же или из файла журнала, как я хочу.

И stty работает на терминале:

mikeserv@localhost$ echo stty -a ">$(tty)" >&3
speed 38400 baud; rows 0; columns 0; line = 0;                                      
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc
-ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl
echoke
-121--74182-

Можно использовать группу процессов:

set -m
(
   for part in input_*; do
     (python3 "$part" || kill 0) &
   done
   wait
)

set -m (и дополнительная функция оболочки POSIX, обязательная функция оболочки Unix) запускает задания в собственной группе процессов. В bash , yash , zsh , mksh , это задания субоболочки, где set -m включен, поэтому внешний (...) и все процессы, созданные в этой группе, будут помещены в ту же группу процессов.

Для тире и других оболочек на основе золы , которые работают только в процессе оболочки верхнего уровня. Так что этот код будет работать, если он не помещен в дополнительный корпус.

Это не будет работать в AT & T ksh или старой оболочке SysV/Bourne вообще.

kill 0 посылает сигнал SIGTERM всем участникам текущей группы процессов.

-121--44521-

Это происходит чаще всего при изменении размеров во время работы полноэкранной программы, которая использует альтернативный экран , например vim или less . Вы можете определить, так ли это, если ваш буфер прокрутки исчезает при запуске программы, а затем снова появляется при выходе.

При изменении размеров во время выполнения такой программы альтернативный экран обновляется с учетом новых размеров клеммы, но основной экран не является основным. Когда вы выходите из программы и возвращаетесь в командную строку на главном экране, представление терминала о его ширине отличается от представления xterm. Это наиболее очевидно, если xterm расширен, но это также вызывает тонкие проблемы, если он сделан более узким.

Все, что я сказал, я не смог дублировать это с xterm-271 в моей системе Ubuntu 12,04. Тем не менее, я вижу это все время используя mintty с Cygwin, и я подозреваю, что исправление то же самое. Просто измените ширину терминала, даже если только на один символ. Это надежно исправляет проблему для меня.

0
27.01.2020, 20:57

CPU

Процесс может снизить свой приоритет CPU (но не уменьшить его, man 2 setpriority ). Кроме того, он может усыпить себя в течение определенного времени. Но он не может решить, как экономить время ЦП другим процессам.

Ситуацию с потоками см. в комментарии psusi.

память Новый процесс получает начальный объем ОЗУ (однако не знаю, является ли это значением ядра по умолчанию или заданным в данных заголовка двоичного файла). Если требуется больше оперативной памяти, процесс запрашивает у ядра дополнительную информацию (см. man 2 mmap ).

Как и во время ЦП, процесс не может решить, какой процесс получит больше памяти, если освободит часть.

Выход из процесса

Если процесс завершает работу (либо по собственному решению, либо в результате прекращения), то ядро автоматически освобождает свои ресурсы. Процесс может освободить «все» его ОЗУ перед выходом, но нет причин для этого. Вместо этого используются вызовы _ exit или exit _ group .

-121--210006-

Я предполагаю, что эти счетчики ( eth0 , eth1 ) относятся к данным уровня 2. Таким образом, трафик eth1 будет трафиком ppp0 плюс заголовок PPPoE.

Кроме того, при передаче Ethernet возникают коллизии (как показано в выходных данных), трафик виртуального интерфейса - нет.

Другим источником увеличения трафика является обработка MSS (для TCP). То есть маршрутизатор отправляет ICMP-пакеты, которые не были отправлены сетью за ним.

Если бы вашей системой злоупотребляли (для спама), то различия были бы огромными (если бы счетчики не были подделаны).

-121--175137-

Причиной может быть наличие набора полей. Это может произойти, если некоторые проклятия приложения не были завершены должным образом. В этом случае ввод reset приведет к сбросу терминала, в частности, запаса.

-1
27.01.2020, 20:57

Теги

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