Pipe dans si déclaration?

J'écris un script bash. J'ai une série de tuyaux fonctionnant pour get toutes les twigs sur un repository git:

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

Actuellement, la déclaration if de cela ne fonctionne pas correctement. Qu'est-ce que je remplace {} avec pour faire ce travail?

Pour copyr l'input standard vers la sortie standard, utilisez cat , not echo .

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

Notez également l'utilisation correcte des guillemets et le placement des tuyaux afin de pouvoir éviter les antislashs. L'utilisation de sed est une optimization très mineure mais je la trouve aussi plus claire que le double tour autour d'une cut (à condition que vous repariez). Vous pouvez également utiliser awk -F/ '{ print $NF }' (mais cela nécessite de grok Awk).

Vous pourriez éviter le cat en faisant cela à la place;

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

(L'échec si vous passez une string vide en tant que deuxième argument devrait au less être plus explicite, sinon plus utile, qu'avec [ -z , qui ne fait pas la distinction entre une valeur non définie et une valeur vide.)

Vous pouvez simplement replace la syntaxe {} que vous essayez d'utiliser avec cat depuis que vous essayez de lire à partir de stdin :

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

Mise à jour : aucun sous-shell n'est nécessaire, merci @sortingpleee .