Существует ли различие между установкой переменной среды к пустой строке и сбрасыванием его?

Это работает на меня на выполнении Linode VPS Debian. Если это не может соединиться, который походит на iptables мне также. Что происходит, если Вы уничтожаете spamd, затем пробуют telnet? Вы получаете соединение, которому отказывают (как Вы должны), или оно все еще зависает, пытаясь соединиться? Раз так это определенно iptables/firewall.

В этом случае что-то как iptables -I INPUT 1 -i lo -j ACCEPT должен добиться цели.

5
26.12.2011, 23:51
3 ответа

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

Пример в самих оболочках IFS окружите переменную (который обычно не экспортируется в среде, но тот же принцип применяется). Если сброшено, оболочка ведет себя, как будто значение было $' \t\n'.

В сценарии оболочки, $foo расширяется до пустой строки ли foo установлен на пустое значение или сброшен. Можно выполнить оболочку под nounset установка (set -u или set -o nounset), в этом случае оболочка сообщает об ошибке и выходит, при попытке развернуть переменную сброса. Иначе можно различать сброс и пустые переменные с модификаторами расширения параметра: ${foo:+a} расширяется до a если foo сброшен или пуст и к пустой строке иначе, тогда как ${foo+a} расширяется до a даже если foo установлен на пустую строку.

5
27.01.2020, 20:39

Существует различие, да. Но это очень тонко начиная с оценки пустой строки, и переменная сброса то же.

$ env - FOO= sh -c 'echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XxX
FOO=
PWD=/tmp
$ env - FOO= sh -c 'unset FOO; echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XX
PWD=/tmp

Оба будут иметь ${FOO:+x} оцените к пустой строке. Но ${FOO+x} оценит к "x", когда НЕЧТО будет пустой строкой.

Одна вещь, для которой я обычно использую это, состоит в том, чтобы настроить a $DEBUG переменная среды, и затем использует ${DEBUG+true} в программе. Затем я могу установить ОТЛАДКУ на что-либо, включая пустую строку.

На высокоуровневых языках, как Perl и Python, вот в чем разница между "" и undef (Perl) или Ни один (Python).

1
27.01.2020, 20:39
  • 1
    Это характерно для Полученных из границы оболочек, и поведение может быть изменено (по крайней мере, в ударе) с set -o nounset. csh' и tcsh рассматривайте сброс и пустые переменные вполне по-другому. Существует очень реальная разница в том, что хранится, и в том, что функционируют C getenv() возвратится. –  Keith Thompson 27.12.2011, 00:47

Сценарий Bash может различать:

  • не задано (среда )переменная
  • значение переменной равно null
  • для переменной задана пустая строка

Из-за множества вариантов обработки «отката по умолчанию» между этими тремя случаями часто нет разницы. Кодер склонен просто использовать первый найденный метод. Можно обрабатывать резервный вариант по умолчанию следующим образом:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.
FOO=${VARIABLE:+default}  # If variable is set use, use default.

# all replacing commands an be used also without ':', so it handles null cases differently
FOO=${VARIABLE-default}  # If variable not set, use default.

# somewhat also used in wild using "test" (see man test"
[[ -z "$FOO" ]] && FOO="defoltíček : "

Я бы предпочел сохранить возможность использования пустой строки в переменной, и поэтому я бы использовал в основном этот подход:

DEFAULT_INTERFACE=$(ip addr show | awk '/inet.*brd/{print $NF; exit}')

INTERFACE_TO_USE=${IFACE=$DEFAULT_INTERFACE}

ПРИМЕЧАНИЕ. :Использование команды IFACE=приведет к сбросу переменной среды. Использование IFACE=""установит переменную в пустую строку.

См. также аналогичную тему https://stackoverflow.com/questions/2013547/assigning-default-values-to-shell-variables-with-a-single-command-in-bash, а также Задать переменную для преобразования в явную пустую строку?

1
14.04.2020, 04:50

Теги

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