.png)
Никогда ранее не видел такого использования в BASH:
pidfile=${PIDFILE-/var/run/service.pid}
Деталь, которую я никогда раньше не видел/не использовал, — это та ${PIDFILE-
самая деталь.
решение1
Это означает, что используйте , $PIDFILE
если $PIDFILE
определено или /var/run/service.pid
если $PIDFILE
не определено.
Запуск новой оболочки:
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/service.pid
Теперь определите PIDFILE:
$ PIDFILE=/var/run/myprogram.pid
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/myprogram.pid
Это из старых времен Bourne Shell.страница руководства sh.
${parameter-word}
If parameter is set then substitute its value;
otherwise substitute word.
Другая форма, которую вы, возможно, уже видели, — это ${parameter:-word}
. Она похожа, но ведет себя по-другому, если parameter
установлена в пустую строку.
${parameter:-word}
Use Default Values. If parameter is unset or null,
the expansion of word is substituted. Otherwise,
the value of parameter is substituted.
Демонстрировать:
$ set | grep NOSUCHVAR # produces no output because NOSUCHVAR is not defined
$ echo ${NOSUCHVAR-default}
default
$ echo ${NOSUCHVAR:-default}
default
$ NULLVAR=
$ set | grep NULLVAR # produces output because NULLVAR is defined
NULLVAR=
$ echo ${NULLVAR-default}
$ echo ${NULLVAR:-default}
default
Обратите внимание, как ${NULLVAR-default}
расширяется до пустой строки, потому чтоNULLVAR
являетсяопределенный.
Для полного объяснения запустите «man bash» и найдитеРасширение параметроввведя «/Раскрытие параметров».
Бит ${parameter-word} скрыт в этом объяснении:
When not performing substring expansion, using the forms documented below,
bash tests for a parameter that is unset or null. Omitting the colon results
in a test only for a parameter that is unset.
Спасибо Деннису за исправление по поводу set и null.
решение2
Микель:
Разве не должно быть так,
pidfile=${PIDFILE:-/var/run/service.pid}
как вы объясняете?