Linux Bash : 터미널 커서 위치를 가져온 후 이상한 동작

라 말호

성공적인 로그인 후 몇 가지 정보를 수집하고 표시하기 위해 쉘 스크립트를 작성했습니다. 그러나 일부 정보는 수집하는 데 약간의 시간이 걸리므로 일부 헤더와 이미 사용 가능한 정보를 앞쪽에 터미널 (ssh putty)로 인쇄하고 뒤로 돌아가서 지연된 정보를 올바른 위치에 인쇄합니다.

이를 달성하기 위해 다음 스크립트를 사용하여 현재 커서 위치를 가져 왔습니다 (이전의 모든 지루한 내용은 무시합니다. printf, cat 및 cut의 무리입니다 ...

. ...
. ...
printf "^[[0m""\n"

# Get current settings.
if ! termios="$(stty -g 2>/dev/null)" ; then
    echo "Not running in a terminal." >&2
    exit 1
fi

# Restore terminal settings when the script exits.
trap "stty '$termios'" EXIT

# Disable ICANON ECHO. Should probably also disable CREAD.
stty -icanon -echo

# Request cursor coordinates
printf '\033[6n'

# Read response from standard input; note, it ends at R, not at newline
read -d "R" rowscols

# Clean up the rowscols (from \033[rows;cols -- the R at end was eaten)
rowscols="${rowscols//[^0-9;]/}"
rowscols=("${rowscols//;/ }")
#printf '(row %d, column %d)\n' ${rowscols[0]} ${rowscols[1]}    *<-- commented by me*

# Reset original terminal settings.
stty "$termios"

# To the stuff...
printf '(row %d, column %d)\n' ${rowscols[0]} ${rowscols[1]}

line=${rowscols[0]}
line=$(($line - 10))                        *<--- Indeed script's line 102. I want subtract 10*
col=56
printf '(r= %d, c= %d)\n' ${line} ${col}    *<--- Printed two times, both times wrong values*

exit 1      *<--- Put here just to exit earlier*


## Get uptime/activetime formated to my taste.
m_activetime=$(/usr/bin/activetime -v)
printf "\33[%d;%dH^[[38;5;196m ${m_activetime}" ${line} ${col}
. ...
. ...

코드를 실행하면 다음과 같은 결과가 나타납니다.

. ...
. ...
. ...
    ||=-= _ |-=-   |+++++++| _    ||= _   |            :
`~‾‾ '--~~__|- =   |+++++__|----~‾  ‾~`---',  CPU stat⸱:
             ~---__|,--~'                     Weather⸱⸱:

(row 16, column 1)
./c.asc: line 102: 16 1 - 10: syntax error in expression (error token is "1 - 10")
(r= 16, c= 1)
(r= 56, c= 0)
lr@pi:~ $

1) 스크립트는 bash (shebang #!/usr/bash)

2) 라인 (row 16, column 1)이 괜찮아 보인다!

3) 스크립트는 c.asc라고합니다.

4) 그 오류가 도대체 ​​무엇인지 궁금합니다. 이전에 bash 배열이 아닌 비슷한 표현식을 사용했지만 심지어 그렇게 ...

line 102: 16 1 - 10: syntax error나는 16을 추측 할 수있다. 그러나 그것은 어디에서 1 - 10왔는가?

(error token is "1 - 10") 어떤 토큰 "1-10"???? !!!

5) 첫 번째 (r= 16, c= 1)는 이미 잘못되었습니다 (r= 6, c= 56). 왜 이런거야? 10을 빼면 어떻게 되나요? col 변수의 값은 어디로 갔 습니까?

6) 더 이상합니다. 두 번째로 인쇄하도록 지시하지 않았습니다. 그래도 이제 변수 라인 에 ID 위기가 있고 col 값을 표시하며 두 경우 모두 col = 56 명령이 무시 된 것 같습니다. 왜 그리고 어떻게 변수 라인 이 변수 col 의 값을 얻었 습니까? col 변수 가 잘못된 값 1에서 잘못된 값 0으로 이동 한 이유는 무엇 입니까?

7) 표시된 스크립트가 오류를 추적하도록 변형되었습니다. 예상 위치로 인쇄하지 않고 오류를 표시하는 것으로 시작되었습니다. 또한 printf의 버전은 printf '(r= %d, c= %d)\n' $((${line} - 10)) ${col}똑같이 유사하고 기괴한 오류를 표시합니다.


추신

터미널 커서 위치를 얻기 위해 스크립트의 일부만으로 몇 가지 추가 실험을 한 후에도 완전히 정상이 아닌 것 같습니다. 위치를 제대로 반환하지만 read r c < <(curspos), ( curspos 가 튜플을 반환하는 스크립트의 이름 이라고 가정) 과 같은 시도를 하면 lin colCtrl-C를 누르고 해당 프롬프트가 미친 후에 프롬프트가 중단됩니다.

감사합니다

제임스 R.

문제는 배열에 값을 인용하고 있다는 것입니다.

rowscols=("${rowscols//;/ }")

이것은 bash에게 공백을 무시하고 하나의 값으로 간주하도록 지시합니다. 따라서 ${rowscols[0]}나중에 첫 번째 값을 얻을 때 실제로 16 1대신 가져 오며 16두 번째 값은 없습니다.

여기에 값을 인용하지 않았기 때문에이 printf와 함께 작동했습니다.

printf '(row %d, column %d)\n' ${rowscols[0]} ${rowscols[1]}

마지막 printf를 두 번 실행 한 이유는 모르겠지만 인용으로 해결되는 것 같습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Ajax에서 데이터를 가져온 후 Pretty Lightbox가 작동하지 않음

분류에서Dev

클릭 한 캐릭터에서 가져온 위치로 가짜 커서 이동

분류에서Dev

bash 터미널 / 콘솔 이상한 겹치는 동작

분류에서Dev

X 서버를 수동으로 시작한 후 가상 터미널에 액세스 할 수 없습니다.

분류에서Dev

OSX bash 터미널 자동 완성-이중 탭에서 이상한 동작

분류에서Dev

Cinnamon을 설치 한 후 Ctrl + Space가 터미널에서 작동하지 않습니다.

분류에서Dev

ssh 터미널에서 cec-client를 사용한 후 Osmc CEC가 작동하지 않습니다.

분류에서Dev

Ubuntu 터미널-마우스 커서 위치로 이동

분류에서Dev

새 커널을 설치 한 후 디스플레이가 이상하게 작동합니다.

분류에서Dev

WSL에서 Ubuntu 서버로 SSH를 통한 이상한 터미널 동작

분류에서Dev

Gnuplot을 가져온 후 GHCI의 이상한 동작

분류에서Dev

현재 위치를 가져온 후 초기 지역 설정이 작동하지 않습니다.

분류에서Dev

Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

분류에서Dev

19.10으로 업그레이드 한 후 터미널에서 열기가 작동하지 않습니다.

분류에서Dev

터미널이 첫 번째 문자를 인쇄 한 후 scanf가 작동하지 않습니다.

분류에서Dev

Retrofit 및 DisposableSingleObserver로 데이터를 가져온 후 notifyDataSetChanged ()가 작동하지 않습니다.

분류에서Dev

.bash_profile을 만든 후 ... 터미널이 작동하지 않습니다.

분류에서Dev

bash 터미널, 커서가 다음 줄의 시작 부분에 표시되기를 원합니다.

분류에서Dev

플랫 UI 터미널, Linux가 아닌 OSX에서 작동

분류에서Dev

Bash (Mac / Linux 터미널 셸)에서 위쪽 및 아래쪽 화살표 키가 텍스트 편집기에서와 같이 작동하도록 만들 수 있습니까?

분류에서Dev

Bash (Mac / Linux 터미널 셸)에서 위쪽 및 아래쪽 화살표 키가 텍스트 편집기에서와 같이 작동하도록 만들 수 있습니까?

분류에서Dev

Linux 64 비트 용 ESET NOD32를 설치 한 후 터미널에 계속 오류가 표시됨

분류에서Dev

데이터를 가져온 후 상태 처리-React

분류에서Dev

heredocs를 사용하여 bash 명령을 터미널에 복사 / 붙여 넣기 할 때 이상한 동작

분류에서Dev

서비스에서 비동기 데이터를 가져온 후 범위를 업데이트하는 각도 js 문제

분류에서Dev

터미널없이 시작할 때 터미널에서 bash 스크립트를 다시 실행하십시오.

분류에서Dev

터미널 버퍼 내용에서 bash (또는 터미널) 자동 완성 (tab-complete)이 가능합니까?

분류에서Dev

서버에서 데이터를 가져온 후 RecyclerView 업데이트

분류에서Dev

IOS Swift-NURLSESSION에서 통계를 가져온 후 다른보기로 이동

Related 관련 기사

  1. 1

    Ajax에서 데이터를 가져온 후 Pretty Lightbox가 작동하지 않음

  2. 2

    클릭 한 캐릭터에서 가져온 위치로 가짜 커서 이동

  3. 3

    bash 터미널 / 콘솔 이상한 겹치는 동작

  4. 4

    X 서버를 수동으로 시작한 후 가상 터미널에 액세스 할 수 없습니다.

  5. 5

    OSX bash 터미널 자동 완성-이중 탭에서 이상한 동작

  6. 6

    Cinnamon을 설치 한 후 Ctrl + Space가 터미널에서 작동하지 않습니다.

  7. 7

    ssh 터미널에서 cec-client를 사용한 후 Osmc CEC가 작동하지 않습니다.

  8. 8

    Ubuntu 터미널-마우스 커서 위치로 이동

  9. 9

    새 커널을 설치 한 후 디스플레이가 이상하게 작동합니다.

  10. 10

    WSL에서 Ubuntu 서버로 SSH를 통한 이상한 터미널 동작

  11. 11

    Gnuplot을 가져온 후 GHCI의 이상한 동작

  12. 12

    현재 위치를 가져온 후 초기 지역 설정이 작동하지 않습니다.

  13. 13

    Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

  14. 14

    19.10으로 업그레이드 한 후 터미널에서 열기가 작동하지 않습니다.

  15. 15

    터미널이 첫 번째 문자를 인쇄 한 후 scanf가 작동하지 않습니다.

  16. 16

    Retrofit 및 DisposableSingleObserver로 데이터를 가져온 후 notifyDataSetChanged ()가 작동하지 않습니다.

  17. 17

    .bash_profile을 만든 후 ... 터미널이 작동하지 않습니다.

  18. 18

    bash 터미널, 커서가 다음 줄의 시작 부분에 표시되기를 원합니다.

  19. 19

    플랫 UI 터미널, Linux가 아닌 OSX에서 작동

  20. 20

    Bash (Mac / Linux 터미널 셸)에서 위쪽 및 아래쪽 화살표 키가 텍스트 편집기에서와 같이 작동하도록 만들 수 있습니까?

  21. 21

    Bash (Mac / Linux 터미널 셸)에서 위쪽 및 아래쪽 화살표 키가 텍스트 편집기에서와 같이 작동하도록 만들 수 있습니까?

  22. 22

    Linux 64 비트 용 ESET NOD32를 설치 한 후 터미널에 계속 오류가 표시됨

  23. 23

    데이터를 가져온 후 상태 처리-React

  24. 24

    heredocs를 사용하여 bash 명령을 터미널에 복사 / 붙여 넣기 할 때 이상한 동작

  25. 25

    서비스에서 비동기 데이터를 가져온 후 범위를 업데이트하는 각도 js 문제

  26. 26

    터미널없이 시작할 때 터미널에서 bash 스크립트를 다시 실행하십시오.

  27. 27

    터미널 버퍼 내용에서 bash (또는 터미널) 자동 완성 (tab-complete)이 가능합니까?

  28. 28

    서버에서 데이터를 가져온 후 RecyclerView 업데이트

  29. 29

    IOS Swift-NURLSESSION에서 통계를 가져온 후 다른보기로 이동

뜨겁다태그

보관