いくつかの基本的なbashスクリプトを書こうとしましたが、これらの文字列をGit
コマンドに拡張するのに問題があることがわかりました。
アイデアは、サブディレクトリにGitリポジトリを含む最上位ディレクトリにスクリプトを渡し、サブディレクトリから同じコマンドを実行してオプションで出力をtee
ファイルに出力することです。
問題は、追加オプションを含むgitコマンドが正しく機能しないことです。だからコマンドが動作しますdiff
。動作しますが、動作しません。たとえば、オプションは機能しません。status
remote
remote show origin
r
e
processing /home/vfclists/project1/
git: 'remote -v' is not a git command. See 'git --help'.
processing /home/vfclists/project1/
git: 'remote show origin' is not a git command. See 'git --help'.
問題はbash
拡張で発生しますか、それGit
自体で発生しますか、またはその両方で発生しますか?
#!/bin/bash
usage()
{
cat << EOF
checkrepos command output file
usage: $0 options
OPTIONS:
commands
r remote show origin
d diff
s status
e remote
other options
-d directory
-t filename for tee
EOF
}
WD=$(pwd)
echo "working directory $WD"
while getopts "c:t:v:h:" OPTION
do
case $OPTION in
c)
case $OPTARG in
r)
COMMAND="remote show origin"
;;
d)
COMMAND="diff"
;;
s)
COMMAND="status"
;;
e)
COMMAND="remote -v"
;;
esac
;;
t)
OUTPUTFILE=$OPTARG
;;
v)
VERBOSE=1
;;
h)
usage
exit 1
;;
?)
usage
exit
;;
esac
done
if [[ -z $COMMAND ]]
then
echo 'command is required'
usage
exit 1
fi
for d in $WD/* ; do
echo ""
echo "===================="
echo ""
echo "processing $d"
git -C "$d" "$COMMAND"
echo ""
echo "===================="
echo ""
done
答え1
r
この場合を例に挙げると、
COMMAND="remote show origin"
続いて
git -C "$d" "$COMMAND"
git
3つの引数、の値、-C
およびd
予想remote show origin
される5つの引数の代わりに(およびがremote
それぞれshow
置き換えorigin
られているremote show origin
)を確認します。
を使用してbash
引用符を削除するだけで問題が解決します。
git -C "$d" $COMMAND
Zshでは、次のように文字列を分割する必要があります。
git -C "$d" $=COMMAND
答え2
その変数を使用してCOMMAND
文字列リストを保存しますが、これはリスト変数ではなく文字列変数です。このコマンドは、、変数値、および変数値git -C "$d" "$COMMAND"
の4つの単語に展開されます。たとえば、値がコマンドラインの3番目の引数である場合、gitはそれを理解しません。git
-C
d
COMMAND
COMMAND
remote -v
git
remote -v
個々のパラメータを渡すには、文字列リストに保存します。大量に。シェルプログラミングでは、「配列」は文字列のリストを表します。
COMMAND=()
…
e) COMMAND=(remote -v);;
…
if ((${#COMMAND[@]} == 0)); then
echo >&2 "Missing command"
usage >&2
exit 2
fi
…
git -d "$d" "${COMMAND[@]}"