
긴 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
또한 zsh
bash를 에뮬레이션할 수 있는(bash 또는 run이라고 부르기만 하면 됨 emulate bash
) 실제로는 다음을 지원합니다.여러 줄 명령!
bindkey -e
또는 를 실행한 bindkey "^[^M" self-insert-unmeta
다음 M-Return을 눌러 새 줄로 이동할 수 있습니다.
하나의 기록 항목으로 저장됩니다. 예상대로 화살표 키를 사용하여 이동할 수 있습니다. 상단/하단 행에서 위/아래로 이동할 때만 항목이 전환됩니다.