Почему локальная fn = $ (…) маскирует $? код состояния

Два определения функций, единственное отличие состоит в том, что первый объединяет ключевое слово local хранилища с назначением, а второе разделяет их:

 function foo { local fn=$(mktemp -p /path/does/not/exist 2>/dev/null) echo $? } function bar { local fn fn=$(mktemp -p /path/does/not/exist 2>/dev/null) echo $? } foo bar 

Это означает «0», затем «1». Я ожидаю, что он будет эхо «1», затем «1». Кажется, что значение $? является результатом присвоения локальному, а не результатом подстановки команды.

Почему bash 4.2.46 (1) -release ведут себя таким образом?

One Solution collect form web for “Почему локальная fn = $ (…) маскирует $? код состояния”

Я думал, что это поведение было задокументировано явно, потому что это такая магия (особенно при запуске сценариев bash с -o errexit !), Но это не похоже. В моей копии руководства указано следующее (о global , который ведет себя так же, как и local когда внутри функции):

Статус возврата равен нулю, если не встречается недопустимая опция, делается попытка определить функцию с помощью '-f foo = bar', делается попытка присвоить значение переменной readonly, делается попытка присвоить значение к переменной массива без использования синтаксиса составного присваивания […], одно из имен не является допустимым именем переменной оболочки, делается попытка отключить состояние readonly для переменной readonly, делается попытка отключить массив статус для переменной массива, или делается попытка отобразить несуществующую функцию с -f.

Таким образом, кажется, что local не является ключевым словом в том смысле, которого можно было бы ожидать в других языках программирования: когда параметр, подобный присваиванию, предоставляется local , что не соответствует инициализации; скорее, local встроенная команда заботится о том, чтобы выполнить назначение, а код возврата – это сам local , а не код, который может выполняться в инициализаторе, и что код возврата будет только ненулевым в списке перечисленных выше.

Чтобы, возможно, ответить на вопрос в более буквальном смысле, как упоминал епископ в комментарии, однажды после того как-то спросил один из сторонников Бата, когда он попросил, будет ли он рассматривать ошибки local отражения, происходящие во время назначения, и, в сущности, ответил, что назначение не является local главная миссия :

Потому что это не то, что местные и его братья и сестры […] делают. Эти встроенные функции существуют для назначения и изменения атрибутов переменных. В качестве дополнительной функции они поддерживают присвоение значений одновременно, но важной функцией является настройка атрибута. Им не нужно знать, как вычислялось значение. […] Поскольку функция устанавливает атрибут или значение, статус выхода должен отражать, было ли это выполнено.

  • Как запустить бесконечный цикл в фоновом режиме
  • Ввод `set -e` убивает bash
  • Прочитать весь файл в памяти?
  • В bash, как я могу повторить имя переменной, а не значение переменной?
  • Выбор Баша: оператор и зарезервированное слово
  • Отменить команду в AND
  • Получите только второй последний аргумент предыдущей команды
  • объявить: «дополнительные атрибуты не вступают в силу до последующих присвоений»
  • bash if statement troubles : не найден
  • Изменить имя хоста - Bash Prompt
  • Какое время выдает «раз»?
  • Трубьте каждую последнюю команду запуска скрипту
  • Interesting Posts

    На лету сжатие читаемой и записываемой папки (например, Windows EFS)?

    Как использовать $? и тест для проверки функции?

    Разница между «локальным переадресацией портов» и «динамической переадресацией портов»?

    Chrome – проблема с картами google

    Существует ли общее соглашение об именах для учетных записей пользователей демона?

    Файл базы данных пакета на Solaris 10

    Возможно ли сделать файлы исполняемыми владельцем по умолчанию?

    Создать фальшивую оболочку в Linux?

    Разделение RGB-файла в 3 файла, по одному для каждого канала?

    Лучший способ программно определить текущий хост (с помощью аппаратных функций)

    Могу ли я обмануть сеанс docker run -it, переназначив ctrl + p key?

    Могу ли я предотвратить замедление zsh с большой историей?

    CentOS: отключить недоступный репозиторий

    ssh_dispatch_run_fatal: неверный код аутентификации сообщения

    Перенаправляет ли вывод в файл блокировку в файле?

    Linux и Unix - лучшая ОС в мире.