Source linux команда не найдена

Обновлено: 07.07.2024

я пытаюсь написать (что я думал, будет) простой скрипт bash, который будет:

  1. запустите virtualenv, чтобы создать новую среду в $1
  2. активировать виртуальную среду
  3. сделайте еще кое-что (установите django, добавьте django-admin.py к пути virtualenv и т. д.)

Шаг 1 работает довольно хорошо, но я не могу активировать virtualenv. Для тех, кто не знаком с virtualenv, он создает что активирует виртуальную среду. Из CLI вы запускаете его с помощью source

где $env_name, очевидно, является именем dir, в котором установлен виртуальный env.

в моем скрипте после создания виртуальной среды я сохраняю путь к скрипту активации следующим образом:

но когда я называю source "$activate" , Я получаю это:

я знаю, что $activate содержит правильный путь к скрипту активации, на самом деле я даже проверьте, что файл есть, прежде чем я вызову source . Но!--5--> сам не может его найти. Я также попытался выполнить все шаги вручную в CLI, где все работает нормально.

в моих исследованиях я нашел этот скрипт, что похоже на то, что я хочу, но также делает много других вещей, которые мне не нужны, например, хранение всех виртуальных сред в

/.каталог virtualenv (или что-то в $WORKON_HOME). Но мне кажется, что он создает путь к activate , а вызов source "$activate" в основном так же, как и я.

вот сценарий в полном объеме:

отказ от ответственности: мой bash script-fu довольно слаб. Мне довольно удобно в CLI, но вполне может быть какая-то чрезвычайно глупая причина, по которой это не работает.

Если вы пишете сценарий bash, назовите его по имени:

/ bin / sh не гарантируется как bash. Это вызвало тонну сломанных скриптов в Ubuntu несколько лет назад (IIRC).

источник builtin отлично работает в bash; но вы можете просто использовать точку, как предложил Норман.

в стандарте POSIX, который /bin/sh предполагается уважать, команда . (одна точка), а не source . The - это csh -изм, который был втянут в bash .

Командная оболочка играет очень важную роль в работе семейства операционных систем Linux. Она используется не только пользователями для работы в терминале, но и программами, а также компонентами операционной системы для обмена данными между собой. Для этого применяются переменные окружения. Для перезагрузки переменных окружения из файла часто используется команда source.

Эта команда позволяет выполнить скрипт в текущем процессе оболочки bash. По умолчанию для выполнения каждого скрипта запускается отдельная оболочка bash, хранящая все его переменные и функции. После завершения скрипта всё это удаляется вместе с оболочкой. Команда source позволяет выполнить скрипт в текущем командном интерпретаторе, а это значит, что всё переменные и функции, добавленные в этом скрипте, будут доступны также и в оболочке после его завершения. Как вы уже поняли, в этой статье будет рассмотрена команда source linux.

Команда source linux

Синтаксис команды очень прост. Надо вызвать саму команду и передать ей путь к исполняемому файлу:

$ source путь_к_файлу аргументы

Никаких опций более не нужно. Если указан не абсолютный путь к файлу, а просто имя файла, то утилита будет искать исполняемый файл в текущей папке и директориях, указанных в переменной PATH. Давайте разберём несколько примеров работы с утилитой. Создаём скрипт, объявляющий переменную:

Затем загрузим переменную из этого файла:

Теперь можно попытаться вывести содержимое переменной и убедиться, что всё работает:

Однако, переменная есть только в текущем командном интерпретаторе, в других командных интерпретаторах её нет. Это отличие команды source от команды export, позволяющей экспортировать переменные окружения глобально.

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

И снова выполняем:

Аналогично работают и функции. Если объявить функцию в скрипте bash, а затем выполнить его с помощью команды source linux, то функция станет доступна в интерпретаторе:

Теперь можно выполнить функцию print_site в терминале или любом другом скрипте:

Вместо команды source можно использовать точку (.), однако здесь следует быть осторожными — между точкой и именем файла должен быть пробел для того, чтобы bash интерпретировал эту точку как отдельную команду, а не как часть имени файла:

Однако, нельзя писать .losstsource или ./losstsource, потому что обозначение ./ — это уже отсылка на текущую директорию, скрипт будет выполнен как обычно.

Выводы

В этой небольшой статье мы рассмотрели работу с командой source linux. Как видите, это очень простая и в то же время полезная команда, очень сильно облегчающая работу в терминале. Именно с её помощью работают виртуальные окружения Python и многие другие подсистемы.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Я обновлял некоторый профиль по умолчанию для bash и видел из обучающих программ, которые я выполнял, чтобы перезагрузить новый профиль новыми настройками среды, используя:

Единственное: - новые переменные среды были доступны только моему текущему пользователю - и были проигнорированы, когда я использовал sudo.

Когда я пытаюсь использовать:

Есть ли простой способ загрузить в новые настройки профиля bash для sudo без закрытия терминала и перезагрузки?

- Вначале я использовал некоторые сценарии установки, которые ссылались на переменные. Я обнаружил, что, хотя они могут обращаться к переменным, когда я вызывал скрипты напрямую (хотя это приведет к возникновению проблемы с созданием каталогов, поскольку мне нужно было быть root), вызов сценариев установки с использованием sudo не будет.

Я доказал это, протестировав с помощью этих простых команд:

Первый будет выдавать значение переменной, а второй ничего не выводит.

Проблема не в том, что source является встроенной командой оболочки. Тот факт, что это то, что на самом деле бросает вам ошибку command not found, но это не значит, что он будет работать, если бы это было.

Реальная проблема заключается в том, как работают переменные среды. И они работают следующим образом: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. Из-за этого использование подоболочки (например, набрав bash внутри экземпляра bash) и просмотр результата env должен давать аналогичные результаты, чем его родитель.

Однако из-за того, как sudo работает (как указано в его man-странице), sudo пытается отключить среду пользователя и создать среду «по умолчанию» для вытесняющего пользователя, так что запуск команды выполняется . Тот факт, что это пользователь, который его вызвал, был вызывающим пользователем (что является ожидаемым поведением) и, таким образом, запускает nautilus, поскольку sudo nautilus должен открыть папку в папке /root, а не /home/yourusername.

Выполняя что-то вроде sudo source script.sh, а затем sudo command, даже если бы это сработало, было бы неуспешно при установке какой-либо переменной на более позднюю sudo command.

In для передачи переменных окружения вы можете сказать sudo о сохранении среды (через переключатель -E и иметь соответствующие разрешения в вашем файле sudoers) и / или установить его для команды как sudo VAR1=VALUE1 VAR2=VALUE2 command.

Favorite

Добавить в избранное (2 оценок, среднее: 5,00 из 5)

Bash Heredoc

К оманда source читает и выполняет команды из файла, указанного в качестве аргумента в текущей среде оболочки. Полезно загружать функции, переменные и файлы конфигурации в сценарии оболочки.

source это оболочка, встроенная в Bash и другие популярные оболочки, используемые в операционных системах Linux и UNIX. Его поведение может немного отличаться от оболочки к оболочке.

Синтаксис исходной команды

Синтаксис команды source следующий:

Примеры команды source

В этом разделе мы рассмотрим некоторые основные примеры использования команды source.

Функции поиска

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

Теперь в каждом из ваших сценариев, которые должны запускаться только пользователем root, просто создайте файл functions.sh и вызовите функцию:

Если вы запустите приведенный выше сценарий как пользователь без полномочий root, он напечатает «Этот сценарий должен быть запущен от имени пользователя root» и завершится.

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

Конфигурационный файл Bash

С помощью команды source вы также можете читать переменные из файла. Переменные должны быть установлены с использованием синтаксиса VARIABLE=VALUE в Bash.

Давайте создадим тестовый файл конфигурации:

В вашем bash-скрипте используйте команду source для чтения файла конфигурации:

Если вы запустите скрипт, результат будет выглядеть так:

Заключение

Из этой статьи вы узнали, как использовать sourceвстроенную команду в сценариях оболочки.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: