Stdin input to a command with nohup

Вы используете переменную 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[@]}"

3
29.02.2016, 23:34
1 ответ

Представьте, что вы пытаетесь запустить сложный сценарий с помощью 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 
2
27.01.2020, 21:27

Теги

Похожие вопросы