Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Вместо того, чтобы просто запустить
read X
... вместо этого заменить его на ...
read X </dev/tty || {
X="some default because we can't read from the TTY here"
}
... если вы хотите читать с консоли. Конечно, это работает только в том случае, если у вас есть a /dev/tty
, но если вы хотите сделать что-то надежное, вы не будете переходить из curl
в оболочку. :)
Другой альтернативой, конечно же, является передача вашего значения X
в командной строке.
curl https://some.place/with-untrusted-code-only-idiots-will-run-without-reading \
| bash -s "value of X here"
... и обратитесь к "$1"
в вашем скрипте, когда вы хотите X
.
(Кстати, я надеюсь, что вы, по крайней мере, используете SSL для этого, вместо того, чтобы советовать людям запускать код, который они скачивают по простому HTTP, нет внеаварийного шага проверки. Многие люди делают это, конечно, но это делает сайты, которые они загружают, - как rvm.io
- большие цели. Большой, простой для человека в середине или -DNS-hijack).
Когда вы cat
сценарий для bash, код для выполнения - , поступающий со стандартного ввода .
Откуда читается read
? Правильно также стандартный ввод. Вот почему вы можете вводить cat
в программы, принимающие стандартный ввод (например, sed
, awk
и т. Д.).
Таким образом, вы не используете «сценарий», если вы сделай это. Вы используете ряд строк ввода.
Где вы хотите read
прочитать данные из этой настройки?
Вы можете это сделать вручную (если вы можете определить такую место). В качестве альтернативы вы можете остановить запуск своего скрипта следующим образом.