나는 종종 긴 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
or를 실행한 bindkey "^[^M" self-insert-unmeta
다음 M-Return을 눌러 새 줄로 이동할 수 있습니다.
히스토리로 저장되어 예상대로 화살표 키를 사용하여 이동할 수 있습니다. 상단/하단 행에서 위/아래로 이동할 때만 항목을 전환합니다.