Вопрос или проблема
Мой 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
в вашем скрипте на оболочке, необходимо учесть несколько важных нюансов.
Причины проблемы
-
Отсутствие правильного синтаксиса для вызова файла: Убедитесь, что вы используете правильный синтаксис для загрузки файла. В Bash и других оболочках, чтобы загрузить переменные окружения из файла, используется команда
source
или.
(точка). Однако в вашем коде это было указано неправильно. -
Формат файла: Убедитесь, что файл
.env
имеет правильный формат. Переменные должны быть в форматеKEY=value
, без пробелов вокруг знака=
. -
Проблемы с путями: При использовании
source .env
или. .env
скрипт должен быть в том же каталоге, что и файл.env
. Убедитесь, что вы запускаете скрипт из нужной директории. -
Права доступа: Файл
.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
Объяснения изменений
-
#!/bin/bash
: Явно используйте bash, так как он более гибкий и позволяет более широкий набор команд и возможностей. -
Проверка наличия: Проверяем, существует ли файл
.env
, и если нет, выводим сообщение об ошибке и завершаем выполнение скрипта. -
Использование
set -a
: Это позволяет автоматически экспортировать переменные, загружаемые из файла.env
, в окружающую среду.
Запуск скрипта
Убедитесь, что вы находитесь в нужном каталоге, где расположен ваш скрипт и файл .env
, и выполните:
./run.sh
Дополнительные замечания
- Убедитесь, что в вашем файле
.env
не содержится лишних пробелов и все переменные заданы корректно. - Если после выполнения указанных шагов проблема останется, проверьте на наличие синтаксических ошибок в самом
.env
и других частях вашего скрипта. - Если скрипт все еще не читает переменные, попробуйте выполнить его с помощью команды
bash run.sh
вместо./run.sh
.
Таким образом, этот подход должен решить вашу проблему с чтением переменных из .env
.