Pipe into if statement?

3

Estou escrevendo um script bash. Eu tenho uma série de canais trabalhando para obter todas as ramificações em um repositório git:

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

Atualmente, a parte da declaração if não funciona corretamente. Para que eu substitui {} por fazer isso funcionar?

    
por Philip Kirkbride 16.05.2017 / 20:11

2 respostas

7

Para copiar a entrada padrão para a saída padrão, use cat , não echo .

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

Observe também o uso adequado de cotações e o posicionamento dos canais para que você possa evitar as barras invertidas. O uso de sed é uma otimização muito pequena, mas eu também acho mais claro do que o duplo rev em torno de um cut (desde que você gere o regex). Você também pode usar awk -F/ '{ print $NF }' (mas isso requer que você melhore Awk).

Você pode evitar o cat fazendo isso;

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

(A falha se você passar uma string vazia como o segundo argumento deve pelo menos ser mais explícito, se não necessariamente mais útil, do que com [ -z , que falha em distinguir entre um valor não definido e um vazio.)

    
por 16.05.2017 / 20:28
5

Você pode simplesmente substituir a sintaxe {} que está tentando usar com cat , já que está tentando ler a partir de stdin :

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

Atualização : nenhum subshell é necessário, graças @tripleee .

    
por 16.05.2017 / 20:19