Bash
如何從 bash 腳本中設置 tmp 環境變數
我有一個簡單的 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腳本具有隻讀訪問權限父級和任何 vars 集都將失去。
有沒有解決的辦法?
採用:
source ./preinstall.sh
或為了更好的便攜性:
. preinstall.sh
來源是點/句點“。”的同義詞。在 bash 中,但不是在 POSIX sh 中,因此為了獲得最大的兼容性,請使用句點。
. (源或點運算符)
從目前 shell 上下文中的文件名參數讀取並執行命令。
您需要來源
./preinstall.sh
. 有兩種方法可以做到這一點:source ./preinstall.sh
要麼
. ./preinstall.sh
Bash 一樣,
ksh
並且zsh
支持.
和source
。它在目前 shell 中讀取並執行指定文件的內容,而不是在新程序中。使用
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 指定了 dot(
.
) 特殊內置函式,但對 . 保持沉默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 腳本可移植性,您應該只使用不帶參數的 dot 命令。
順便說一句,如果您從位置可能發生變化的腳本中採購,我建議您使用絕對路徑而不是相對路徑。