줄 바꿈은 누가 수행하고 어떻게 비활성화합니까?

줄 바꿈은 누가 수행하고 어떻게 비활성화합니까?

직렬 어댑터(pyserial, screen 또는 minicom)를 통해 Linux 장치에 연결하고 설정을 어떻게 변경하더라도(예: stty긴 명령을 입력하면 줄 바꿈됩니다(특히 공백 및 캐리지 리턴 입력). 제가 이 분야에 대한 지식이 너무 부족해서 초보자라고 할 수도 없는데, 줄을 읽는 도구나 쉘 인터프리터가 줄바꿈을 하고 있는 것은 아닐까요?

마찬가지로 stty크기를 변경해도 60 100줄 바꿈이 발생하는 지점은 전혀 변경되지 않습니다.

쉘 정보:

root@4020-1-00007:~# echo $SHELL
/bin/sh
root@4020-1-00007:~# ls -al /bin/sh 
lrwxrwxrwx    1 root     root             9 Jul 31 18:09 /bin/sh -> /bin/bash
root@4020-1-00007:~# bash --version
GNU bash, version 4.3.0(1)-release (arm-angstrom-linux-gnueabi)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

(어떤 빌드 옵션이 선택되었는지 어떻게 알 수 있는지 잘 모르겠습니다)

답변1

쉘과 터미널이 모두 관련되어 있습니다. 사용하게 될 대부분의 터미널은 자동으로 줄을 바꿉니다. 시작 시 bash(inlib/readline/terminal.c) 이와 관련된 두 개의 termcap 플래그를 확인하십시오.

  _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");

그 중 (참고용어 정보(5))는 터미널이 VT100(및 관련 터미널)에 대해 특별한 방법으로 줄을 래핑하는지 여부를 알려줍니다.

   auto_right_margin         am     am   terminal has automatic
                                         margins
   eat_newline_glitch        xenl   xn   newline ignored
                                         after 80 cols (concept)

이는 Linux 콘솔과 xterm의 경우입니다. Bash가 이를 확인하면 표시된 대로 커서가 오른쪽 여백에 있는지 판단할 때(래핑 결함을 방지하기 위해) 래핑에 도움이 됩니다.디스플레이.c:

  /* If we're at the right edge of a terminal that supports xn, we're 
     ready to wrap around, so do so.  This fixes problems with knowing 
     the exact cursor position and cut-and-paste with certain terminal 
     emulators.  In this calculation, TEMP is the physical screen 
     position of the cursor. */

동시에 터미널은 다음 상황에서 기본적으로 래핑됩니다.그것오른쪽 여백에 도달합니다. stty터미널에 100개의 열이 없고 터미널에 무엇을 지시했는지 알 수 없는 경우 stty터미널 크기를 100개 열로 늘리기를 사용해도 도움이 되지 않습니다. bash는 알고 있습니다(또는 환경 변수를 설정하지 않는 한 알아야 합니다 COLUMNS).

하지만 터미널 창에 실제로 100개의 열이 있다고 가정하면...

bash가 줄 길이에 대해 혼동되면 OP의 설명과 일치하는 방식으로 오작동합니다.

가장 간단한 예는 직렬 연결을 열고 라인이 가득 찰 때까지 일부 키를 입력하는 것입니다. 그러면 라인이 손상되고다음 줄에서 계속하거나 동일한 이전 줄에서 계속하세요..

이는 여러 버그 보고서의 주제였습니다.배쉬 FAQ, 그러나 언급된 유일한 측면은 프롬프트에서 인쇄할 수 없는 문자 문제입니다.

댓글보니 이런 연관성이 있는거 같네요"Linux 장치 통과TV 시리즈어댑터"Used는 터미널의 너비를 쉘에 확실하게 알릴 수 없으므로 기본값은 80열입니다.

busybox에 대한 설명은 후속 편집에서 실제 쉘이 bash임을 보여 주므로 대상에서 벗어난 것 같습니다. 그러나 "직렬 어댑터"에 대한 설명은 창 크기 이벤트를 셸에 전달하지 않는다는 의미입니다. Bash의 소스 코드를 읽으면 이 경우 첫 번째 초기화에서만 유용한 화면 크기만 얻는 것 같습니다(Bash는 단지_rl_get_screen_size처음에 또는 a에 대한 응답으로 SIGWINCH).

하지만 당신은할 수 있는실제 화면 크기로 터미널 설명을 생성하고 이를 서브셸에서 사용합니다(bash는 시스템이 올바른 화면 크기를 제공할 수 없을 때 이 설명을 사용합니다).

#!/bin/sh                                                           
infocmp -1 | \
sed     -e 's/^[^[:space:]].*|/fixed|/' \
        -e '/lines#/d' \
        -e '/cols#/d' \
        >foo
resize -u | awk '
/COLUMNS=/{ sub("COLUMNS=","cols#"); }
/LINES=/{ sub("LINES=","lines#"); }
/export/{ next; }
        { sub(";",","); printf "\t%s\n", $0; }
' >>foo
tic foo
TERM=fixedsize bash

답변2

그것은터미널 에뮬레이터줄 바꿈을 수행합니다. 터미널 에뮬레이터에 일부 정보를 전송하여 끌 수 있습니다제어 순서:

줄 바꿈을 끄십시오.

$ printf %b '\033[?7l'

줄 바꿈을 켜십시오.

$ printf %b '\033[?7h'

또는 사용산출:

줄 바꿈 끄기

$ tput rmam     

개행 켜기

$ tput smam

man 5 terminfo자세한 내용은 참조하십시오 .

관련 정보