다음과 같은 긴 명령으로 일부 스크립트를 구성하고 싶습니다.
{ somecheck || somecomand "reallyreallyreallyreallyreallyreallylongstring" } &> /dev/null &
다음과 같이 됩니다:
{ somecheck || \
somecomand "reallyreally" \
"reallyreally" \
"reallyreally" \
"longstring" \
} &> /dev/null &
하지만 분사가 걱정됩니다. 이를 피하기 위해 다음을 고려하고 있습니다.
{ somecheck || \
somecomand "$(echo \
"reallyreally" \
"reallyreally" \
"reallyreally" \
"longstring" \
)" \
} &> /dev/null &
bash/zsh에서 여러 줄 문자열을 실행하는 다른 방법을 아는 사람이 있습니까? 이 정보를 검색하는 데 문제가 있습니다. 적어도 세 가지 프로세스(스크립트, 배경 블록 및 명령 대체 하위 쉘)를 의미하는 것 같습니다. 더 좋은 방법이 있을까요?
미리 감사드립니다!
답변1
이와 같이 줄 연속을 사용하면 문자열에 공백이 추가됩니다. 시퀀스는 backslash-newline-whitespace
단일 공백으로 대체됩니다.
변수를 사용하는 것만으로도 가독성이 크게 향상됩니다.
url="reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongstring"
{ somecheck || somecomand "$url" } &> /dev/null &
여전히 배열을 사용하여 하위 문자열로 나눌 수 있습니다.
parts=(
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"longstring"
)
whole=$(IFS=; echo "${parts[*]}")
그러나 추가된 복잡성을 고려할 때 리터럴 문자열을 분할하는 것이 실제로 그렇게 중요합니까?
답변2
음, 조금 단순화할 수 있습니다:
$ [ -f /dev/null ] || sed 's/a/A/g' <(echo "thisis""avery"\
"long""string"\
"Ihave""separated"\
"into""smaller"\
"substrings")
thisisAverylongstringIhAvesepArAtedintosmAllersubstrings
중요한 것은 입력 문자열에 추가 공백이 없어야 한다는 것입니다 \
.
변수 사용에 대한 Glenn의 조언은 훌륭하고 간단합니다. 그대로 두십시오.
답변3
나는 Glenn의 두 제안 사이 어딘가에 접근 방식을 제안합니다. 즉, (간단한 스칼라) 변수를 사용하되 정의를 여러 줄로 나누는 것입니다.
myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ali"
myword="${myword}docious"