$ {1: + “$ @”} в / bin / sh

Я заметил, что иногда скрипты-оболочки используют ${1:+"[email protected]"} для параметров, а не только для "[email protected]" .

Например, http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh использует

 exec "$binary" $opts ${1:+"[email protected]"} 

Может ли кто-нибудь сломать ${1:+"[email protected]"} на английский язык и объяснить, почему это было бы преимуществом по сравнению с обычным "[email protected]" ?

«Истерические изюм», иначе исторические причины.

Объяснение от JesperE (или страницы пользователя Bash) является точным для того, что он делает:

Если $ 1 существует и не является пустой строкой, замените цитируемый список аргументов.

Когда-то 20 лет назад некоторые сломанные второстепенные варианты Bourne Shell заменили пустую строку «» на «$ @», если не было никаких аргументов вместо правильного текущего поведения подстановки ничего. Будут ли какие-либо такие системы все еще использоваться, открыты для обсуждения.

[Хм: это расширение не будет работать правильно:

 command '' arg2 arg3 ... 

В этом контексте правильная нотация:

 ${1+"[email protected]"} 

Это работает правильно, является ли $ 1 пустым аргументом или нет. Итак, кто-то неправильно вспомнил обозначение, случайно введя ошибку.]

Чтобы процитировать соответствующую часть man bash для информации, которую упоминал Джонатан Леффлер в своем комментарии:

Если не выполняется расширение подстроки, тесты bash для параметра, который не задан или null ; опускание двоеточия приводит к тесту только для параметра, который не задан .

(акцент мой)

На странице справки bash:

  ${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. 

Таким образом, вместо $1 отменяется "[email protected]" . Я не понимаю, почему они не могли использовать "[email protected]" .

  • Экспорт из sqlite в csv с использованием сценария оболочки
  • Как запустить сценарий оболочки без использования команд «sh» или «bash»?
  • Как считать все строки кода в каталоге рекурсивно?
  • Очистить stdin перед чтением
  • Извлечь подстроку в Bash
  • Различия и выполнение `set` &` env`?
  • find: отсутствующий аргумент для -exec
  • Какова цель: (двоеточие) GNU Bash встроена?
  • Прочтите данные json в сценарии оболочки
  • Как создать задание cron с помощью Bash автоматически без интерактивного редактора?
  • Как копировать ввод-вывод, а не просто перенаправлять (Windows и Linux)
  • Interesting Posts

    Выполнять как ярлык администратора без запроса пароля

    Трафик не перенаправляется через NAT

    Проблема с Chrome с фиксированными фиксированными элементами фиксированной и фиксированной позиции

    Сколько адресов памяти мы можем получить с 32-битным процессором и 1 ГБ оперативной памяти?

    Преобразование значения временного интервала для форматирования «hh: mm Am / Pm» с использованием C #

    Два внешних монитора

    Изображение панорамы и масштабирования

    android – установить шрифт на платформу Android без root

    javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL больше не работает, поскольку Java EE 7 / EL 3.0

    Изменить версию сборки в сборке .NET-сборки

    Запрос EF с условным включением

    jQuery шаблоны двигателей

    Как использовать экзистенциальный оператор CoffeeScript для проверки некоторых свойств объекта для неопределенного?

    Ширина CSS / Max-Width на линии Wrap?

    Является ли вызов деструктором вручную всегда признаком плохого дизайна?

    Давайте будем гением компьютера.