Вы используете переменную COMMAND
для хранения списка строк, но это строковая переменная, а не переменная списка. Инструкция git -C "$ d" "$ COMMAND"
расширяется до четырех слов: git
, -C
, значение переменной d
и значение переменной COMMAND
. Если значение КОМАНДА
, например, remote -v
, то третий аргумент в командной строке git
- это remote -v
, который git не понимает.
Чтобы передать отдельные аргументы, сохраните их в списке строк, то есть в массиве . «Массив» в программировании оболочки означает список строк.
COMMAND=()
…
e) COMMAND=(remote -v);;
…
if ((${#COMMAND[@]} == 0)); then
echo >&2 "Missing command"
usage >&2
exit 2
fi
…
git -d "$d" "${COMMAND[@]}"
Представьте, что вы пытаетесь запустить сложный сценарий с помощью nohup. Вы можете определить, пытается ли он прочитать stdin, перенаправив stdin на дескриптор файла, из которого нельзя читать. Посмотрите на эти два примера: сначала 0:
rm nohup.out
nohup sh -c 'head -1' 0</dev/null
echo $?
cat nohup.out
Файл nohup.out пуст, а код возврата ($?
) от скрипта равен 0, то есть нормально, так как скрипт только что прочитал конец файла. Теперь попробуйте выполнить тот же сценарий с 0>/dev/null
т.е. 0 открыт только для вывода:
rm nohup.out
nohup sh -c 'head -1' 0>/dev/null
echo $?
cat nohup.out
Это дает сообщение об ошибке в nohup.out
head: error reading 'standard input': Bad file descriptor
и код выхода 1, fail. Предположительно, это более полезно для вас. Вы также можете получить тот же эффект, закрыв stdin командой 0<&-
:
rm nohup.out
nohup sh -c 'head -1' 0<&-
echo $?
cat nohup.out