여러 줄 명령 체인에 주석을 달고 계십니까?

여러 줄 명령 체인에 주석을 달고 계십니까?

긴 AND/OR 문을 만들어 형식을 지정하는 코드가 있는 경우가 많습니다. 예를 들어:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

때로는 위와 같은 명령의 단일 단계가 복잡할 수 있습니다. 그래서 나는 그것에 대해 논평하고 싶습니다.

예를 들어, cut명령이 실제보다 더 복잡하다고 가정해 보겠습니다. 그래서 나는 다음과 같은 일을 하고 싶습니다:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            # Here is a note
            | cut -d' ' -f5 \
            | tr --delete \;)

이것이 잘못된 구문이라는 것을 알고 있습니다.

하지만 긴 명령 체인에 주석을 달기 위한 전략을 갖고 있는 사람이 있는지 궁금합니다.

답변1

이것은 Bash 등에서 작동하는 것 같습니다 dash.

#!/bin/sh
seq 20 |       # make a long list
grep '[234]'   # mut only take part of it

유사하게 파이프와 함께 &&또는 ||파이프 대신에, 또한 내부에도 있습니다 $( ... ).

답변2

명령의 구문이 유효하지 않게 만드는 유일한 이유는 각 줄의 개행 문자를 불필요하게 이스케이프 처리한다는 사실입니다.

당신의 명령,

gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

와 동일하다

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  | cut -d' ' -f5 | tr --delete \;)

즉, 쉘의 관점에서 보면 전혀 여러 줄의 명령이 아닙니다.

cut명령 대체가 종료되지 않게 되기 전에 여기에 주석을 삽입하면 (최종 명령 )은 칭찬됨):

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  # Here is a note | cut -d' ' -f5 | tr --delete \;)

그러나 줄바꿈을 피할 필요는 없습니다. 다음은 완전히 유효한 코드입니다.

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            | cut -d' ' -f5
            | tr --delete \;)

여기에 주석을 삽입해도 괜찮습니다.

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            # Here is a note
            | cut -d' ' -f5
            | tr --delete \;)

파이프라인의 각 부분 뒤에는 하나 또는 여러 개의 줄 바꿈이 올 수 있고 주석은 셸의 파서에서 무시되기 때문에 이렇게 하는 것이 좋습니다.


실제를 살펴보면암호grep, 이는 더 안전하고 이식성이 뛰어난 변형입니다( 여전히 비표준 확장을 사용해야 하는 초기 버전 제외 ).

gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
            | grep -F 'option routers'
            # Here is a note
            | cut -d ' ' -f 5
            | tr -d ';' )

답변3

또한 zshbash를 에뮬레이션할 수 있는(bash 또는 run이라고 부르기만 하면 됨 emulate bash) 실제로는 다음을 지원합니다.여러 줄 명령!

bindkey -e또는 를 실행한 bindkey "^[^M" self-insert-unmeta다음 M-Return을 눌러 새 줄로 이동할 수 있습니다.

하나의 기록 항목으로 저장됩니다. 예상대로 화살표 키를 사용하여 이동할 수 있습니다. 상단/하단 행에서 위/아래로 이동할 때만 항목이 전환됩니다.

관련 정보