Bash

如何從 bash 腳本中設置 tmp 環境變數

  • July 9, 2020

我有一個簡單的 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_VERSIONvar沒有設置。

如果我直接在終端中導出這些變數,則沒有問題。

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 命令。

順便說一句,如果您從位置可能發生變化的腳本中採購,我建議您使用絕對路徑而不是相對路徑。

引用自:https://serverfault.com/questions/1024512