Это диагностическое сообщение генерируется системой управления заданиями интерактивной оболочки, для удобства пользователя -оно не связано с ошибкой базовой программы. Когда вы передаете функцию оболочки, для запуска функции создается подоболочка , и эта подоболочка не рассматривается как обращенная к пользователю -. Если вы вызываете функцию в обычном режиме, она запускается в исходной оболочке, и сообщение печатается.
Вы можете проверить это, отключив управление заданиями в текущей оболочке
set +m
, а затем снова запустив ./binary
:, теперь он тоже ничего не печатает. По -включите управление заданиями с помощью set -m
.
Даже голая подоболочка имеет тот же эффект:
( : ;./binary )
не будет печатать диагностику (здесь требуются две команды, чтобы избежать подоболочки -игнорирования оптимизации ). Вывод из функции тоже делает это.
Управление заданиями отключено в подоболочке, и даже если оно включено вручную, оно отключается. Это досадный пробел в системе. В не -интерактивной оболочке сообщение всегда будет передаваться через другой механизм, и в любом другом месте в интерактивной оболочке это будет так же.
Если печать диагностики важна для вас, создание сценария вместо функции позволит вам убедиться, что он всегда включен. Поскольку вы используете функцию в конвейере, вы все равно не можете делать ничего, что требует функции, поэтому это не требует больших затрат.
Я бы не сказал, что это ошибка. Одна из возможных причин такого поведения — заставить подстановку команд $(...)
, которая также запускает подоболочку, вести себя соответствующим образом:
foo=$(echo|test)
не должно приводить к сохранению диагностического сообщения в foo
, чтобы сбои конвейера приводили к пустым расширениям. Другой способ — намеренно временно подавить диагностические сообщения.
Вы можете развернуть все подстановки оболочки в текущей командной строке.
shell-expand-line (M-C-e) - Expand the line as the shell does. This performs alias and history expansion as well as all of the shell word expansions (see Shell Expansions).
Нажмите:Ctrl + Esc + e .
Пример:
$ echo $(curl -s ifconfig.io)
# press ctrl+esc+e,
# command line will switch to:
$ echo 151.101.1.69
Обратите внимание, что я добавил -s
к curl
, чтобы избежать смешения stderr
с командной строкой. Для других команд вы можете использовать 2> /dev/null
.
Я использую Bash в Kubuntu на ноутбуке -не Apple. Ctrl + Alt + e расширяет многие элементы командной строки, включая $(whatever)
. Я не уверен, как нажатие клавиши «переводится» на клавиатуру Mac. Дело в том, чтобы запустить команду shell-expand-line
.
Примечания:
whatever
могут прервать ваш поток Поэтому я думаю, что хорошо сначала набрать $(whatever)
, развернуть его и только потом добавлять остальные.