if 문으로 파이프하시겠습니까?

if 문으로 파이프하시겠습니까?

나는 bash 스크립트를 작성 중입니다. Git 저장소의 모든 브랜치를 가져오는 일련의 파이프라인이 있습니다.

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        echo {}
      else
        echo {} > $2
    fi

현재 if 문 부분이 제대로 작동하지 않습니다. {}이 작업을 수행하려면 무엇을 교체해야 합니까 ?

답변1

표준 입력을 표준 출력으로 복사하려면 cat대신 를 사용하십시오 echo.

git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
  then
    cat
  else
    cat > "$2"
fi

또한 백슬래시를 피할 수 있도록 따옴표를 올바르게 사용하고 파이프를 배치해야 합니다. 사용은 매우 사소한 최적화이지만 seddouble을 둘러싸는 것보다 더 깔끔하다고 생각합니다(grok 정규식이 있는 경우). 사용할 수도 있습니다(그러나 이를 위해서는 Awk를 알아야 합니다).revcutawk -F/ '{ print $NF }'

cat이렇게 하면 이를 방지 할 수 있습니다 .

${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'

[ -z(빈 문자열을 두 번째 인수로 전달하는 경우 실패는 설정되지 않은 값과 null 값을 구별할 수 없기 때문에 반드시 더 유용하지는 않더라도 최소한 with보다 더 명시적이어야 합니다 .)

답변2

읽으려고 하므로 {}사용하려는 구문을 대체할 수 있습니다 .catstdin

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        cat
      else
        cat > $2
    fi

고쳐 쓰다: 서브쉘이 필요하지 않습니다. 감사합니다.@삼루타.

관련 정보