Мой скрипт не может читать переменные .env

Вопрос или проблема

Мой shell-скрипт не считывает переменные из .env на Ubuntu 24.02.

$ gnome-shell --version
GNOME Shell 46.0

Вот мой скрипт.

//Скрипт
#!/bin/sh
set +x
set +e
source .env 
clear
echo "Запуск симуляции флеш-кредита"
echo "PRIVATE_KEY: $PRIVATE_KEY"
echo "SEPOLIA_RPC_URL: $SEPOLIA_RPC_URL"
echo "строка 9"
cat .env
forge clean
forge build --force

Когда я выводил содержимое файла .env в той же директории, что и скрипт.

$ cat .env
SEPOLIA_EQUALIZER_LENDER=xxxxxxxxxxxxxxxxxxxxxxxxxx
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/xxxxxxxxxxxxxx
PRIVATE_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Вывод терминала. Примечательно, что команда cat не выводит PRIVATE_KEY здесь.

Запуск симуляции флеш-кредита
PRIVATE_KEY: 
SEPOLIA_RPC_URL: 
строка 9
SEPOLIA_EQUALIZER_LENDER=0x0837b2aCcF87De52a099409863CDb5f3588342AD
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/xxxxxxx
# PRIVATE_KEY= здесь не указан, несмотря на то, что он указан в команде cat выше
[⠊] Компиляция...4d6a4949fa623629e0ED6bd4Ecb78A8C847693
[⠢] Компиляция 36 файлов с Solc 0.8.26
[⠆] Solc 0.8.26 завершен за 1.06с
Компиляция прошла успешно!

И, наконец, файлы.

$ ls
cache  foundry.toml  lib  notes.txt  out  README.md  run.sh  script  src  test  wip.sh
$ ls -a
.  ..  cache  .env  foundry.toml  .git  .gitignore  lib  notes.txt  out  README.md  run.sh  script  src  test  wip.sh
$ ls -la
total 64
drwxrwxr-x  9 myuser myuser 4096 Oct  7 11:13 .
drwxrwxr-x  7 myuser myuser 4096 Oct  4 13:39 ..
drwxrwxr-x  2 myuser myuser 4096 Oct  7 11:13 cache
-rw-------  1 myuser myuser  195 Oct  6 16:37 .env
-rw-rw-r--  1 myuser myuser  377 Oct  6 13:15 foundry.toml
drwxrwxr-x  8 myuser myuser 4096 Oct  6 16:34 .git
-rw-rw-r--  1 myuser myuser  653 Oct  4 13:40 .gitignore
drwxrwxr-x  4 myuser myuser 4096 Oct  4 10:16 lib
-rw-rw-r--  1 myuser myuser  744 Oct  4 16:23 notes.txt
drwxrwxr-x 38 myuser myuser 4096 Oct  7 11:13 out
-rw-rw-r--  1 myuser myuser  980 Oct  4 10:16 README.md
-rwxrwxr-x  1 myuser myuser  628 Oct  7 11:04 run.sh
drwxrwxr-x  2 myuser myuser 4096 Oct  6 16:34 script
drwxrwxr-x  2 myuser myuser 4096 Oct  6 15:29 src
drwxrwxr-x  2 myuser myuser 4096 Oct  6 15:29 test
-rwxrwxr-x  1 myuser myuser  182 Oct  4 13:41 wip.sh

Я внес изменения после комментариев ниже.

#!/bin/sh
set +x
set +e
. .env
echo "Запуск симуляции флеш-кредита"
echo "PRIVATE_KEY: $PRIVATE_KEY"
echo "SEPOLIA_RPC_URL: $SEPOLIA_RPC_URL"
echo "строка 9"
cat .env

Теперь я установил права доступа к .env на 777, и оба файла находятся в одной папке.

$ ls -la
total 68
drwxrwxr-x  9 myuser myuser 4096 Oct  7 12:09 .
drwxrwxr-x  7 myuser myuser 4096 Oct  4 13:39 ..
-rwxrwxrwx  1 myuser myuser  195 Oct  6 16:37 .env
-rwxrwxr-x  1 myuser myuser  163 Oct  7 12:26 run.sh

Запуск скрипта вызывает ошибку.

$ ./run.sh 
./run.sh: 4: .: .env: not found

Обновление раунд 2.

#!/bin/sh
set +x
set +e
#. .env -->.: .env: not found
#..env -->..env: not found
#. ./env -->cannot open ./env: No such file

echo "Запуск симуляции флеш-кредита"
echo "PRIVATE_KEY: $PRIVATE_KEY"
echo "SEPOLIA_RPC_URL: $SEPOLIA_RPC_URL"
echo "строка 9"
cat .env

Ответ или решение

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

Причины проблемы

  1. Отсутствие правильного синтаксиса для вызова файла: Убедитесь, что вы используете правильный синтаксис для загрузки файла. В Bash и других оболочках, чтобы загрузить переменные окружения из файла, используется команда source или . (точка). Однако в вашем коде это было указано неправильно.

  2. Формат файла: Убедитесь, что файл .env имеет правильный формат. Переменные должны быть в формате KEY=value, без пробелов вокруг знака =.

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

  4. Права доступа: Файл .env должен быть доступен для чтения. Вы установили права на 777, что должно обеспечить доступ, но, как правило, достаточно установки прав на 644 (чтение для всех и запись для владельца).

Решение

Попробуйте следующий код скрипта:

#!/bin/bash  # рекомендуется использовать bash вместо sh
set -e

# Загрузка переменных из .env
if [ -f .env ]; then
    # Правильный способ загрузки
    set -a  # Все экспортируемые переменные будут доступны через env
    source .env
    set +a
else
    echo ".env файл не найден."
    exit 1
fi

clear
echo "Запуск симуляции flash loan"
echo "PRIVATE_KEY: $PRIVATE_KEY"
echo "SEPOLIA_RPC_URL: $SEPOLIA_RPC_URL"
echo "line 9"
cat .env
# Дальнейшие команды
forge clean
forge build --force

Объяснения изменений

  1. #!/bin/bash: Явно используйте bash, так как он более гибкий и позволяет более широкий набор команд и возможностей.

  2. Проверка наличия: Проверяем, существует ли файл .env, и если нет, выводим сообщение об ошибке и завершаем выполнение скрипта.

  3. Использование set -a: Это позволяет автоматически экспортировать переменные, загружаемые из файла .env, в окружающую среду.

Запуск скрипта

Убедитесь, что вы находитесь в нужном каталоге, где расположен ваш скрипт и файл .env, и выполните:

./run.sh

Дополнительные замечания

  • Убедитесь, что в вашем файле .env не содержится лишних пробелов и все переменные заданы корректно.
  • Если после выполнения указанных шагов проблема останется, проверьте на наличие синтаксических ошибок в самом .env и других частях вашего скрипта.
  • Если скрипт все еще не читает переменные, попробуйте выполнить его с помощью команды bash run.sh вместо ./run.sh.

Таким образом, этот подход должен решить вашу проблему с чтением переменных из .env.

Оцените материал
Добавить комментарий

Капча загружается...