Как лучше вводить строки продолжения?

Хотя этот ответ напрямую не относится к virtualenvиспользованию -, как насчет использования virtualenvwrapper? Это в основном virtualenvна стероидах, заботясь об управлении envs. После установки вы получаете набор дополнительных команд:

  • workonперечисляет все доступные окружения при вызове без аргументов и активирует окружение при вызове с именем окружения в качестве аргумента, например, workon myenvактивирует окружение myenv;
  • mkvirtualenv myenvсоздает новую среду myenv;
  • rmvirtualenv myenvудаляет его.

Но есть еще кое-что-virtualenvwrapperопределяет набор полезных хуков, где вы можете реализовать свою собственную логику для настройки envs, например:

  • premkvirtualenvвыполняется, когда окружение создано, но еще не активировано;
  • postmkvirtualenvвыполняется при создании и активации окружения;
  • preactivateвыполняется при активации env;
  • postactivateвыполняется при активации окружения;
  • predeactivateвыполняется при срабатывании деактивации окружения;
  • postdeactivateвыполняется, когда env была деактивирована;

и многие другие. Например, у меня есть хук postmkvirtualenv, который устанавливает ipythonв новую среду :

.

$ cat $VIRTUALENVWRAPPER_HOOK_DIR/postmkvirtualenv
#!/bin/bash
# This hook is sourced after a new virtualenv is activated.

env=$(basename "$VIRTUAL_ENV")
logger -s -t "($env)" "installing ipython..."
"$VIRTUAL_ENV/bin/pip" install ipython --quiet

Чтобы определить дополнительную логику для деактивации окружения, вам придется написать собственный сценарий bash и поместить его содержимое либо в $VIRTUALENVWRAPPER_HOOK_DIR/predeactivate(, если вам нужно запустить свои вещи, пока окружение все еще активировано ), либо $VIRTUALENVWRAPPER_HOOK_DIR/postdeactivate(. ] если вам нужно деактивировать env для запуска пользовательского кода ).

Для справки:virtualenvwrapperдокументы .

Полный список хуков см. в По -Пользовательской настройке .

0
02.05.2021, 12:48
1 ответ

Функция обратной косой черты без кавычек в команде оболочки заключается в экранировании следующего символа. Другой способ сказать, что обратная косая черта удаляет особое значение следующего символа,если этот символ имеет особое значение.

Новая строка — это признак конца команды, точно так же, как ;и несколько других символов. Обратная косая черта удаляет эту функцию из новой строки, чтобы команда могла продолжиться на следующей строке. Вот, кстати, почему вы не можете даже поставить символ пробела после обратной косой черты в конце строки, которую нужно продолжить, поскольку в этом случае обратная косая черта не будет выходить за фактическую новую строку.

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

Другой подход, который может быть полезен при некоторых обстоятельствах, если ваша оболочка поддерживает массивы (, как, например, bashимеет ), заключается в сохранении команды в массиве, подобном:

mycommand=(
    myapp -a 'foo foo'  
          -b 'bar bar'
          -c 'baz baz'
          -d 'qux qux'
              bar
)

Новые строки в этом назначении массива функционируют просто как разделители между элементами массива, точно так же, как и пробелы. Элементы, которым нужны пробелы, должны быть заключены в кавычки, как показано в примере здесь (и точно так же, как они должны были быть заключены в кавычки в любом случае в командной строке ).

Чтобы запустить эту команду, вы должны использовать

"${mycommand[@]}"

Обратите внимание, что двойные кавычки необходимы . Они гарантируют, что каждый элемент массива заключен в кавычки.

В качестве альтернативы используйте массив только для аргументов:

myapp_args=(
    -a 'foo foo'  
    -b 'bar bar'
    -c 'baz baz'
    -d 'qux qux'
        bar
)

, а затем:

myapp "${myapp_args[@]}"
2
28.07.2021, 11:35

Теги

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