Как расширить и отредактировать результат подстановки команд в Bash?

Это диагностическое сообщение генерируется системой управления заданиями интерактивной оболочки, для удобства пользователя -оно не связано с ошибкой базовой программы. Когда вы передаете функцию оболочки, для запуска функции создается подоболочка , и эта подоболочка не рассматривается как обращенная к пользователю -. Если вы вызываете функцию в обычном режиме, она запускается в исходной оболочке, и сообщение печатается.

Вы можете проверить это, отключив управление заданиями в текущей оболочке

set +m

, а затем снова запустив ./binary:, теперь он тоже ничего не печатает. По -включите управление заданиями с помощью set -m.

Даже голая подоболочка имеет тот же эффект:

( : ;./binary )

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

Управление заданиями отключено в подоболочке, и даже если оно включено вручную, оно отключается. Это досадный пробел в системе. В не -интерактивной оболочке сообщение всегда будет передаваться через другой механизм, и в любом другом месте в интерактивной оболочке это будет так же.


Если печать диагностики важна для вас, создание сценария вместо функции позволит вам убедиться, что он всегда включен. Поскольку вы используете функцию в конвейере, вы все равно не можете делать ничего, что требует функции, поэтому это не требует больших затрат.


Я бы не сказал, что это ошибка. Одна из возможных причин такого поведения — заставить подстановку команд $(...), которая также запускает подоболочку, вести себя соответствующим образом:

foo=$(echo|test)

не должно приводить к сохранению диагностического сообщения в foo, чтобы сбои конвейера приводили к пустым расширениям. Другой способ — намеренно временно подавить диагностические сообщения.

1
04.05.2020, 12:45
2 ответа

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

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.

3
28.04.2021, 23:16

Я использую Bash в Kubuntu на ноутбуке -не Apple. Ctrl + Alt + e расширяет многие элементы командной строки, включая $(whatever). Я не уверен, как нажатие клавиши «переводится» на клавиатуру Mac. Дело в том, чтобы запустить команду shell-expand-line.

Примечания:

  • ошибки из whateverмогут прервать ваш поток
  • другие вещи также будут встроены
  • цитирование будет потеряно

Поэтому я думаю, что хорошо сначала набрать $(whatever), развернуть его и только потом добавлять остальные.

3
28.04.2021, 23:16

Теги

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