Назад | Перейти на главную страницу

sh bash script неоднозначный идентификатор перенаправления файла с использованием одинарных кавычек

У меня есть следующая новая строка в моем файле .sh

su --session-command='$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile' $serviceUser || return 1

Когда у меня было это с двойными кавычками, это несколько работало, но у pidFile был неправильный pid, он был отключен на единицу. Решение из исследования заключалось в использовании одинарных кавычек, и я не могу заставить работать одинарные кавычки.

У меня сейчас 2 ошибки

bash: $ pidFile: неоднозначное перенаправление
bash: $ serviceLogFile: неоднозначное перенаправление

Кажется, я не могу использовать переменные или выводить переменные в одинарные кавычки?

Эта строка почти работает, но pid отключен на единицу
Этот код ниже будет запускаться при загрузке, но pid неправильный.

su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1

который должен был заменить этот старый двухстрочный код с ошибками.

cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"
# Don't forget to add -H so the HOME environment variable will be set correctly.
sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1

Старый код работал нормально, но не запускался сразу после загрузки.

Идентификатор процесса отличается на единицу, потому что вы добавили дополнительный & после $javaCommandLine. Другими словами, вы поместили два процесса в фоновый режим перед вызовом echo $!, таким образом получая PID >>$serviceLogFile 2>&1 скорее, чем $javaCommandLine. Эти две части должны быть помещены в одну, как показывают старые двухстрочные коды.

 su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1

Возможно, вам придется изменить его на -

 su --session-command="$javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1