我有一个简单的 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
var 没有设置。
如果我直接在终端中导出这些变量,则不会出现问题。
https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell#answer-496777 根据这篇文章,shell 脚本对父级具有只读访问权限,并且任何设置的变量都将丢失。
有没有解决的办法?
答案1
使用:
source ./preinstall.sh
或者为了更好的可移植性:
. preinstall.sh
source 是 bash 中点/句点 '.' 的同义词,但在 POSIX sh 中不是,因此为了获得最大兼容性请使用句点。
. (源或点运算符)
在当前 shell 上下文中从 filename 参数读取并执行命令。
答案2
您需要获取./preinstall.sh
。有两种方法可以做到这一点:
source ./preinstall.sh
或者
. ./preinstall.sh
Bash 也ksh
支持zsh
和.
。source
它在当前 shell 中读取并执行指定文件的内容,而不是在新进程中。
使用bash
shell:
$ 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.
为了最大程度地实现 shell 脚本的可移植性,您应该仅使用不带参数的点命令。
顺便说一句,如果您从位置可能发生变化的脚本中获取数据,我建议您使用绝对路径而不是相对路径。