私はbashスクリプトを書いています。私はgitリポジトリのすべてのブランチを取得するために動作する一連のパイプを持っています:
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
echo {}
else
echo {} > $2
fi
現在、これのifステートメント部分は正しく機能しません。何を置き換えますか{}
でこれを機能させるには?
標準入力を標準出力にコピーするには、cat
ではなくecho
を使用します。
git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
then
cat
else
cat > "$2"
fi
バックスラッシュを回避できるように、引用符の適切な使用とパイプの配置にも注意してください。 sed
の使用は非常にマイナーな最適化ですが、rev
の周りの二重のcut
よりも明確であることがわかります(groex regexの場合)。 awk -F/ '{ print $NF }'
を使用することもできます(ただし、Awkを調べる必要があります)。
代わりにこれを行うことでcat
を回避できます。
${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'
(2番目の引数として空の文字列を渡す場合の失敗は、[ -z
を使用した場合よりも明示的である必要がありますが、未設定と空の値を区別できません。)
{}
cat
から読み取ろうとしているため、stdin
で使用しようとしている構文:
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
cat
else
cat > $2
fi
更新:サブシェルは必要ありません、ありがとう @ tripleee 。