У меня есть простой сценарий bash:
#!/bin/bash
export MONGOMS_DOWNLOAD_URL="https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.8.tgz"
export MONGOMS_VERSION="4.2.8"
но когда я запускаю этот './preinstall.sh', а затем echo $MONGOMS_VERSION
переменная не установлена.
Если я экспортирую эти вары прямо в терминал, проблем нет.
https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell#answer-496777 Согласно этому сообщению, сценарий оболочки имеет доступ только для чтения к родительскому объекту, и все установленные переменные будут потеряны.
Есть ли способ обойти это?
Вам нужен источник ./preinstall.sh
. Это можно сделать двумя способами:
source ./preinstall.sh
или
. ./preinstall.sh
Баш, как и ksh
и zsh
поддерживает оба .
и source
. Он читает и выполняет содержимое указанного файла в текущей оболочке, а не в новом процессе.
Используя bash
оболочка:
$ type source
source is a shell builtin
$ type .
. is a shell builtin
$ source --help
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$
POSIX указывает точку (.
) специальный встроенный, но ничего не говорит о source
. Из стандарта:
NAME
dot - execute commands in the current environment
SYNOPSIS
. file
DESCRIPTION
The shell shall execute commands from the file in the current environment.
If file does not contain a <slash>, the shell shall use the search path specified by PATH to find the directory containing file. Unlike normal command search, however, the file searched for by the dot utility need not be executable. If no readable file is found, a non-interactive shell shall abort; an interactive shell shall write a diagnostic message to standard error, but this condition shall not be considered a syntax error.
OPTIONS
None.
Для максимальной переносимости сценария оболочки следует использовать только команду точки без аргументов.
Кроме того, я рекомендую вам использовать абсолютные пути вместо относительных, если вы используете скрипты, расположение которых может измениться.
Использование:
source ./preinstall.sh
или для лучшей переносимости:
. preinstall.sh
источник является синонимом точки / точки '.' в bash, но не в POSIX sh, поэтому для максимальной совместимости используйте точку.
. (оператор источника или точка)
Прочтите и выполните команды из аргумента имени файла в текущем контексте оболочки.
Видеть: . (оператор источника или точка)