как печатать из функции bash? [Дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
8
задан McShaman 5 January 2015 в 10:32
поделиться

3 ответа

отправить вывод терминала в stderr:

function test_function {
    echo "Echo value to terminal" >&2
    echo "return value"
}
12
ответ дан Jasen 19 August 2018 в 12:25
поделиться
  • 1
    bash, похоже, открывает tty также в дескрипторе &255, поэтому, если stderr также перенаправлен, вы можете сообщить пользователю, используя >&255 вместо >&2 – Jasen 19 October 2016 в 21:38
  • 2
    это нестабильное / надежное поведение - если оно не охвачено документацией, оно не гарантирует, что оно останется верным в будущих версиях или даже будет истинным во всех конфигурациях времени выполнения (т. е. быть согласованным между интерактивными и неинтерактивными оболочками). – Charles Duffy 19 May 2018 в 15:47

Не используйте подстановку команд для получения возвращаемого значения из функции

Возвращаемое значение всегда доступно в переменной $?. Вы можете использовать переменную, а не использовать команду substitution

Test

$ function test_function {
> return_val=10; 
> echo "Echo value  to terminal $return_val";
> return $return_val; 
> }

$ test_function
Echo value  to terminal 10

$ return_value=$?

$ echo $return_value
10
4
ответ дан nu11p01n73R 19 August 2018 в 12:25
поделиться
  • 1
    Я рассматривал это решение, но заявления эха кажутся распечатываемыми сразу после того, как функция завершила работу (правильно ли я это говорю?). Полагайте, что моя функция очень интенсивна и длительна. Я хочу, чтобы он предоставлял пользователю обновления прогресса во время его запуска. – McShaman 5 January 2015 в 22:28
  • 2
    Том Фенеч отправил комментарий моему OP, в котором говорилось, что я запускаю функцию в подоболочке. Я не понимал, что это то, что я делаю. Так что это может сработать. – McShaman 5 January 2015 в 23:00
  • 3
    @McShaman Подстановка команды $() создает новую подоболочку. увеличение нагрузки – nu11p01n73R 6 January 2015 в 05:07
  • 4
    Вопрос заключался в том, как вернуть результат (строку) обратно вызывающему, и в то же время иметь возможность писать на консоль. Не как получить код возврата. Ваш ответ не возвращает строку вообще. – User0 8 September 2016 в 20:42

Тем не менее решение, отличное от отправки в STDERR (может быть предпочтительным, если ваш STDERR имеет другое использование или может быть перенаправлен вызывающим абонентом)

Это решение направляет прямо на терминал tty:

function test_function {
    echo "Echo value to terminal" > /dev/tty
    echo "return value"
}
7
ответ дан Robin Hsu 19 August 2018 в 12:25
поделиться
  • 1
    Мне нравится это решение ... Но будет ли / dev / tty одинаковым на каждой машине? Есть ли способ получить это местоположение динамически? – McShaman 5 January 2015 в 21:37
  • 2
    Для случаев исключения вам необходимо определить ОС, попробуйте uname -a, man uname или echo $OS. Или, возможно, вам нужно определить дистрибутив (например, Linux). Файл устройства tty не гарантированно находится в одном месте. – Robin Hsu 6 January 2015 в 08:55
  • 3
    Но даже в Windows Cygwin имеет /dev/tty. :-) – Robin Hsu 6 January 2015 в 08:59
  • 4
    Извините, что возродил старый вопрос, но будет ли это также работать, когда вы будете захвачены, скажем, Systemd? – PairedPrototype 30 November 2017 в 02:36
  • 5
    Я не знаю, почему это может быть связано с Systemd, и я не знаком с Systemd. Сожалею. Возможно, вы должны задать новый вопрос, – Robin Hsu 25 December 2017 в 08:56
Другие вопросы по тегам:

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