Читайте из stdin, остановите, затем предложите [дублировать]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

2
задан TheFox 20 November 2014 в 20:36
поделиться

2 ответа

Вместо того, чтобы просто запустить

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).

7
ответ дан Charles Duffy 18 August 2018 в 00:59
поделиться

Когда вы cat сценарий для bash, код для выполнения - , поступающий со стандартного ввода .

Откуда читается read? Правильно также стандартный ввод. Вот почему вы можете вводить cat в программы, принимающие стандартный ввод (например, sed, awk и т. Д.).

Таким образом, вы не используете «сценарий», если вы сделай это. Вы используете ряд строк ввода.

Где вы хотите read прочитать данные из этой настройки?

Вы можете это сделать вручную (если вы можете определить такую место). В качестве альтернативы вы можете остановить запуск своего скрипта следующим образом.

1
ответ дан Etan Reisner 18 August 2018 в 00:59
поделиться
Другие вопросы по тегам:

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