여러 줄 명령 체인에 주석을 달까요?

여러 줄 명령 체인에 주석을 달까요?

나는 종종 긴 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 -eor를 실행한 bindkey "^[^M" self-insert-unmeta다음 M-Return을 눌러 새 줄로 이동할 수 있습니다.

히스토리로 저장되어 예상대로 화살표 키를 사용하여 이동할 수 있습니다. 상단/하단 행에서 위/아래로 이동할 때만 항목을 전환합니다.

관련 정보