Bash: почему “установленный” не ведет себя как, я ожидаю это к?

Обычно много дистрибутивов обеспечивают 'сетевой' установочный диск - включая Debian. Если у Вас есть нормальное широкополосное соединение, вероятно, самый легкий путь состоит в том, чтобы установить через сетевую установку как:

  • Вы загружаете только вещи, в которых Вы нуждаетесь
  • Вы (обычно - я не уверен в Debian), не должны обновлять вещи прямо после установки, поскольку новейший пакет установлен со всеми примененными патчами безопасности
  • У Вас нет проблем, что Вы загрузили только некоторые диски, в то время как Вы любимый редактор не включены

Сетевое изображение является столь же большим как 40-120 МБ для debian.

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

2
16.03.2011, 01:33
3 ответа
set MONGODB="/usr/local/mongodb/bin"

Это не переменное присвоение. (Это один в оболочке C (csh, tcsh), но не в оболочках стиля Границы (sh, пепел, удар, ksh, zsh, …).) Это - вызов к set встроенный, который устанавливает позиционные параметры, т.е. $1, $2, и т.д. Попытайтесь выполнить эту команду в терминале, затем echo $1.

Для присвоения значения переменной оболочки просто запишите

MONGODB="/usr/local/mongodb/bin"

Это создает переменную оболочки (также названный (именованным) параметром), с которым можно получить доступ $MONGODB. Переменная остается внутренней к оболочке, если Вы не экспортировали ее с export MONGODB. Если экспортируется, переменная также видима ко всем процессам, запущенным той оболочкой через среду. Можно уплотнить присвоение и экспорт в одну строку:

export MONGODB="/usr/local/mongodb/bin"

Поскольку, что Вы делаете, кажется, нет потребности в MONGODB вне сценария, и PATH уже экспортирован (после того как переменная экспортируется при присвоении нового значения она отражается в среде). Таким образом, можно записать:

MONGODB="/usr/local/mongodb/bin"    
PATH=${PATH}:${MONGODB}
3
27.01.2020, 21:55

Я попытаюсь объяснить, как работают переменные оболочки. Абсолютно возможно добавить локальные переменные к переменной среды как ПУТЬ.

Каждый рабочий процесс имеет список переменных среды. Они - name=value пары. Когда новый процесс создается с ветвлением (), это наследовало те переменные (среди прочего как открытые файлы, идентификатор пользователя, и т.д.). В контрастной оболочке переменные являются внутренним понятием оболочки. Они не наследованы при создании нового процесса. Можно экспортировать переменные оболочки и сделать их переменными среды. Когда в сценарии оболочки Вы пишете FOO='bar' это - переменная оболочки. Можно попытаться создать 2 сценария:

# test1.sh
FOO='bar'
sh test2.sh

# test2.sh
echo "${FOO}"

При выполнении первого сценария, он устанавливает внутреннюю переменную оболочки, затем называет ветвление (). Родительский процесс оболочки будет ожидать (), чтобы ребенок закончил затем, выполнение продолжается (если существует больше команд). В должностном лице дочернего процесса () назван для загрузки новой оболочки. Этот новый процесс не знает о НЕЧТО. Если Вы изменяете первый сценарий:

# test1.sh
export FOO='bar'
sh test2.sh

переменная НЕЧТО становится частью среды и наследованный к разветвленному процессу. Важно отметить, что среда не глобальна. Дочерние процессы не могут влиять на переменные среды своего родителя.

# test3.sh
sh test4.sh
echo "${PATH}"

# test4.sh
export PATH="${PATH}:/new/path"

Модификации в test4.sh не видимы в test3.sh. Информация просто не идет тем путем. Когда дочерний процесс заканчивается, его среда отбрасывается. Давайте изменим test3.sh:

# test3.sh
source test4.sh
echo "${PATH}"

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

Поскольку Вы, вероятно, знаете, что ПУТЬ является специальной переменной среды, которая говорит оболочку, где искать другие исполняемые файлы. Когда новая оболочка входа в систему запускается это автоматически источники .bash_profile. Переменные, объявленные там, будут видимы. Однако в .bash_profile при вызове других сценариев с sh ПУТЕМ, Вы устанавливаете в тех сценариях, будет потерян.

2
27.01.2020, 21:55

Возможно, использование "набора" является неподходящим?

Да, существует Ваша проблема. set не делает то, что Вы могли бы ожидать. Из документации:

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

Отметьте заметное отсутствие "на самом деле переменных оболочки набора" в том списке вещей, которые это делает. Проложенный под землей во всех документах, Вы найдете, что то, что это делает, устанавливает позиционные параметры оболочки на аргументы, которые Вы дали. Вы просто даете один аргумент, весь из MONGODB="/usr/local/mongodb/bin". Так $1 установлен на это (и $# установлен на 1, так как существует только один аргумент).

Выиграть один за антимнемонические названия команды Unix, ха?

Так так или иначе попробуйте просто:

MONGODB=/usr/local/mongodb/bin
export PATH=${PATH}:${MONGODB}

и это будет работать.

1
27.01.2020, 21:55
  • 1
    Охладитесь! (Мне бы хотелось принять больше чем один ответ.) Просто для уточнения; затем: метафлаг набора на, было бы надлежащее использование встроенного набора, потому что это устанавливает опцию оболочки метафлага. –  seasonedgeek 16.03.2011, 01:53
  • 2
    Удивительно, нет. Это установит $1 "метаотметить" и $2 к "на". meta-flag установка readline и это set часть полностью различного синтаксиса readline init файл (обычно ~/.inputrc). –  mattdm 16.03.2011, 02:17
  • 3
    ой; позиционные настройки, получил его. Хороший материал. –  seasonedgeek 16.03.2011, 02:27

Теги

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