Что делает $ {1 + “$”}, означают в сценарии оболочки, и как он отличается от “$”?

То, что Вы ищете, называют "ssh мультитранзитным участком". Довольно возможно сделать это прозрачно, с помощью директивы ProxyCommand в .ssh/config (или эквивалентная опция конфигурации в PuTTY или what-have-you):

Host linux-server-b
  ProxyCommand ssh -q linux-server-a nc -q0 linux-server-b 22

Что это делает, когда Вы пытаетесь соединиться с linux-server-b:

  • открывает соединение SSH для linux-server-a
  • выполнения netcat там, и открывает соединение TCP для linux-server-b
  • вперед это соединение назад с Вами

Таким образом, можно использовать все функции SSH, как будто Вы были подключены с linux-server-b непосредственно; можно даже объединить несколько транзитных участков в цепочку вместе (сервер к серверу B к серверу C к серверу D...)

См. также:

43
19.03.2013, 23:24
3 ответа

Это для совместимости с Оболочкой Bourne. Оболочка Bourne была старой оболочкой, которая была сначала выпущена с версией 7 Unix в 1979 и была все еще распространена до середины 90-х как /bin/sh на большинстве коммерческих Нельдов.

Это - предок большинства подобных Границе оболочек как ksh, bash или zsh.

Это имело несколько неловких функций, многие из которых были зафиксированы в ksh и другие оболочки и новая стандартная спецификация sh, один из которых является этим:

С Оболочкой Bourne (по крайней мере, те варианты, где это не было зафиксировано): "$@" расширяется до одного пустого аргумента, если список позиционных параметров пуст ($# == 0) вместо никакого аргумента вообще.

${var+something} расширяется до "чего-то" если $var сброшен. Это ясно документируется во все оболочки, но трудно найти в bash документация, поскольку необходимо обратить внимание на это предложение:

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

Так ${1+"$@"} расширяется до "$@" только если $1 установлен ($# > 0) который работает вокруг того ограничения Оболочки Bourne.

Обратите внимание, что Оболочка Bourne является единственной оболочкой с той проблемой. Современный shs (который является sh приспосабливание спецификации POSIX sh (который Оболочка Bourne не)), не имеют той проблемы. Таким образом, Вам только нужно это при необходимости в коде для работы над очень старыми системами где /bin/sh могла бы быть Оболочка Bourne вместо стандартной оболочки (обратите внимание, что POSIX не указывает местоположение стандарта sh, так, например, на Солярисе перед Солярисом 11, /bin/sh была все еще Оболочка Bourne (хотя не имел того конкретного вопроса), в то время как нормальное/стандартное sh был в другом месте (/usr/xpg4/bin/sh)).

Существует проблема в этом perlrun страница perldoc в этом $0 не заключается в кавычки все же.

См. http://www.in-ulm.de/~mascheck/various/bourne_args/ для получения дополнительной информации.

53
27.01.2020, 19:34
  • 1
    Не Может воспроизвести в Семейной реликвии. Вероятно, не применимый к Солярису. –  ormaaj 19.03.2013, 23:18
  • 2
    @ormaaj. Да, посмотрите страницу, которую я связал. Это было зафиксировано в SVR3 И Solaris/SunOS выше 5 перебазирующихся на SVR4. И та страница упоминает, что 4.1.x не имел проблемы также. –  Stéphane Chazelas 19.03.2013, 23:21
  • 3
    я вижу.<3 Страницы Mascheck. –  ormaaj 19.03.2013, 23:38

Существует различие между:

command ""

и

command

В одном Вы передаете один аргумент, который является пустой строкой. Во втором существуют нулевые переданные аргументы.

Для обоих, "$" приравняется к тому же самому: "". Но использование ${1:+"$@"} был бы "" поскольку первое и никакие аргументы передали для второго, которое было намерением.

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

: sshwrapper [command]
exec /usr/bin/ssh "${HOSTNAME:-localhost}" "$@"

Это попыталось бы работать "" на удаленном хосте (который просто возвращается), это не была бы интерактивная оболочка.

: sshwrapper [command]
exec /usr/bin/ssh "${HOSTNAME:-localhost}" ${1:+"$@"}

Запустил бы интерактивную оболочку на удаленном хосте, потому что должностное лицо правильно интерпретирует переменную как ничто, не пустую строку.

Считайте на использовании "$ {параметр: + слово}" ("Используют Альтернативное Значение"), и подобные переменные строки расширения в страницах руководства удара.

3
27.01.2020, 19:34
  • 1
    это, кажется, применяется только к Оболочке Bourne а не для любого совместимого на POSIX sh реализация (см. другой ответ). –  törzsmókus 07.01.2015, 10:08
  • 2
    Нет, ${1:+"$@"} не расширился бы ни до какого аргумента если $1 было пусто. Вы хотите ${1+"$@"}. В основном у Вас есть инвертированный. –  Stéphane Chazelas 07.01.2015, 11:40

Я подвел ответ Стефана Чазелас:

  • $ {1: + «$ @ {1: +« $ @ »}« Тест, если $ 1 или Uneret
  • $ {1 + «$ @}» Тест, если $ 1 Unset

, так что если использовать второй с параметром «», это означает, что 1 доллар - это нулевой, но он не проверяет, является ли это значением null или нет, он просто видит, что он уже уволен, тем не менее Таким образом, он расширит $ @, но вы используете $ {1: + «$ @»} 'с "", он больше не будет расширяться $ @ .

0
27.01.2020, 19:34

Теги

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