*sh 줄을 더 짧게 만드는 방법

*sh 줄을 더 짧게 만드는 방법

zsh최근에 한 줄의 코드를 만났습니다.

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATCH}/\*/'=(#b)($PREFIX:t)(?)*'}}

이것이 나를 놀라게 했을 뿐만 아니라, 80자 제한을 훨씬 초과했습니다. 안타깝게도 단축할 수 있는 명확한 방법이 없습니다. 이와 같은 행이 많이 있습니다(분할할 수 없는 매우 복잡한 대체 항목으로 구성됨). 해당 줄의 길이가 80자 미만이기를 원하는 경우 이러한 줄을 처리하는 표준 방법은 무엇입니까?

답변1

다음과 같이 긴 줄을 끊을 수 있습니다.개행 문자 이스케이프, \그 뒤에 개행 문자가 옵니다:

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-\
9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATC\
H}/\*/'=(#b)($PREFIX:t)(?)*'}}

경고하다

거의 모든 곳에서 이 방법으로 줄을 감쌀 수 있지만 예외가 있습니다. 작은따옴표로 묶인 텍스트 내부나 \이스케이프 시퀀스( \n, \x40, ...) 뒤에는 작동하지 않습니다 . 일부 다른 쉘 구성도 중단될 수 있습니다. ($PREFIX예제에서 및 사이에 중단 시도를 넣으면 올바르게 작동하지 않습니다.:t)

답변2

다음을 수행할 수 있습니다.

setopt extendedglob
alias 'verbose{{=read -rd "" -u9 _code 9<<-"}}";\
  eval "${_code//[[:space:]]#$'\''\n'\''[[:space:]]#}"'

verbose{{
  ls_colors_parsed=${
    ${(@s.:.)LS_COLORS}
      /(#m)\**=[0-9;]#
      /${
          ${MATCH
            /(#m)[0-9;]##
            /$MATCH=$MATCH=04;$MATCH
          }
            /\*
            /'=(#b)($PREFIX:t)(?)*'
      }
  }
}}

공백 문자로 둘러싸인 줄 바꿈은 eval해석에 전달되기 전에 제거됩니다.

관련 정보