Установить переменную для расширения до явной пустой строки?

Что больше уважает конфиденциальность пользователей?

Mint использует репозитории Ubuntu. В зависимости от того, что вы устанавливаете, они практически одинаковы.

Но, более того, нельзя ожидать, что разработчики такого большого дистрибутива, как Mint / Ubuntu, будут осведомлены о проблемах конфиденциальности каждого пакета. Хорошо, это довольно субъективно, поэтому я добавлю пример:

Некоторые люди считают проверку сертификата OSCP Firefox (и Chromium) вторжением в частную жизнь.Это потому, что вы никогда не просили Firefox проверить сертификат по базе данных OSCP, и эта база данных узнает о ваших привычках просмотра.

По-прежнему Firefox находится в официальных репозиториях почти всех дистрибутивов Linux и с включенным OSCP. Черт, это по умолчанию идет с большинством из них.

Существуют также репозитории приложений , которые могут содержать любое программное обеспечение. Репозитории приложений в некоторой степени контролируются, как, например, AUR Arch, но может пройти значительное время, пока проблемное программное обеспечение не будет удалено.

Являются ли оба исходных кода полностью и общедоступными для изучения?

Некоторые части микропрограмм (особенно драйверы) имеют закрытый исходный код.

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

Опять же, это зависит от того, действительно ли вы используете эти вещи.

caveat emptor

Дистрибутивы со скользящим выпуском более безопасны?

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

Конечно, практически любой дистрибутив Linux / * BSD никогда не бывает таким плохим, как трагедия конфиденциальности, продаваемая Microsoft или Banana Corp (не могу назвать имя явно, я боюсь нарушить права на товарный знак :)).

3
20.02.2017, 18:44
4 ответа

TL,DR: Почему мой сценарий оболочки подавляется пробелами или другими специальными символами?. Упс, это еще длиннее... Ну, настоящий TL,DR: всегда ставьте двойные кавычки вокруг переменных и командных подстановок. Кроме того, смотрите конец этого ответа для второй проблемы с вашим скриптом.

В вашем скрипте невозможно заставить расширение переменной расшириться до пустой строки. Расширение переменной без кавычек проходит процесс "expand+split+glob":

  1. Возьмите значение переменной, которое является строкой.
  2. Разделите строку на пробельные символы (в общем случае на символы, которые присутствуют в значении переменной IFS). В результате получается список строк (возможно, пустой, если исходная строка не содержала ничего, кроме пробелов).
  3. Для каждого элемента списка, если он содержит хотя бы один символ подстановки *?\[ и элемент является шаблоном, который соответствует хотя бы одному файлу, то элемент заменяется списком совпадений.

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

Вам нужно изменить сценарий и заставить его использовать прямое расширение переменной вместо использования оператора expand+split+glob: поставьте двойные кавычки вокруг расширения переменной.

Кроме того, ${DOMAIN_SUFFIX:=.example.com} расширяется до .example.com, если значение DOMAIN_SUFFIX пусто. Поэтому вы никогда не получите пустую строку для этого значения. Чтобы сохранить пустое значение и использовать .example.com, только если DOMAIN_SUFFIX не установлен, измените := на =.

#!/bin/sh
./somecommand -s "${DOMAIN_SUFFIX=.example.com}"
0
27.01.2020, 21:25

Используйте:

"$ {DOMAIN_SUFFIX = .example.com}"

$ {параметр = default}, $ {parameter: = default}

Если параметр не задан, установите его по умолчанию.

Обе формы почти эквивалентны. : Имеет значение только тогда, когда $ параметр был объявлен и имеет значение null.

http://www.tldp.org/LDP/abs/html/parameter-substitution.html

Обратите внимание, что вам также нужны кавычки "" , чтобы предотвратить удаление пустого значения после интерполяция (только что заметил, что в вашем коде их нет, спасибо @Gilles!).

Также обратите внимание, что = (или : = ) также назначит значение по умолчанию для DOMAIN_SUFFIX (если не задано), поэтому, если вам нужно только получить значение, вы можете хотите использовать вместо этого - .

1
27.01.2020, 21:25

Я думаю, что это часть bash руководство, которое вы ищете (POSIX имеет аналогичную формулировку того же эффекта ):

Если не выполняется раскрытие подстроки, используйте формы, задокументированные ниже (например, : - ), bash проверяет параметр, который не задан или равен нулю. Если пропустить двоеточие, выполняется проверка только для параметра, который равен отключено.

Разница между неустановленной переменной и переменной с нулевым значением состоит в том, что неустановленной переменной даже не существует.

Итак,

#!/bin/bash

bash -c 'echo "$#"; printf "%s\n" "$@"' -- "${DOMAIN_SUFFIX=.example.com}"

Это установит DOMAIN_SUFFIX на .example.com , если DOMAIN_SUFFIX не задан, но не, если он равен нулю (пустая строка ).

Используемая здесь команда просто создаст новый процесс bash , который напечатает номер переданного аргумента командной строки, за которым следуют все позиционные параметры, по одному в каждой строке:

bash-4.4$ bash script
1
.example.com
bash-4.4$ DOMAIN_SUFFIX=.hello.world bash script
1
.hello.world
bash-4.4$ DOMAIN_SUFFIX= bash script
1

bash-4.4$

В последнем примере , DOMAIN_SUFFIX = идентичен DOMAIN_SUFFIX = "" .

0
27.01.2020, 21:25

Обратите внимание, что после того, как все расширения были выполнены оболочкой и оказались в пустом поле, оно удаляется, если оно не было заключено в кавычки. Поскольку вы не указали переменную в кавычках, если она преобразуется в пустой "", она должна быть удалена из списка аргументов "somecommands". Мало того, что если в DOMAIN_SUFFIX есть пробелы или widlcards, то вы потенциально можете превзойти некоторую команду.

Также $ {DOMAIN_SUFFIX: =. Example.com} - это опечатка, основанная на результатах, которые вы показываете для: DOMAIN_SUFFIX = '' ./example, поскольку пустой DOMAIN_SUFFIX будет заменен на его значение по умолчанию. value и которое затем помещается в список аргументов somecommand. Следовательно, он никогда не видит «пустого». $ {DOMAIN = .example.com} объяснит вам полученные результаты.

1
27.01.2020, 21:25

Теги

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