Bash

如何將環境變數傳遞給非互動式外殼(帶有範例)?

  • April 14, 2019

在 sh 腳本中,另一個 sh 腳本以su -l <user> -c /path/to/script.sh. 據我了解script.sh將在非互動式外殼中執行。官方文件試圖解釋如何在這種非互動式 shell 中設置變數,即將它們傳遞到BASH_ENV[ http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html ]。對於初學者來說,這顯然是一個不充分的解釋,並且沒有(真實的)範例(在 $SEARCH_ENGINE 中也沒有找到)。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

可能意味著很多

$$ 1 $$. 有人可以舉一個傳遞給非互動式shell的環境變數的例子。 只是為了確保:登錄和非登錄以及互動式和非互動式之間的區別對我來說很清楚(https://superuser.com/questions/636219/where-should-i-export-an-environment- variable-so-that-all-combinations-of-bash-d或引用的連結,如果有人感興趣的話)。


$$ 1 $$我試過

  • BASH_ENV="\\$PATH=$PATH\\n\\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • BASH_ENV="\$PATH=$PATH\n\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • su -l artifactory -c echo $JAVA_HOME

如果它是一個sh腳本 - 就像它顯式引用的那樣#!/bin/sh- 可能仍然是bash但就像呼叫它一樣--posix --no-rc --no-profile- 然後您可以使用環境變數指定ENV文件:ENV

ENV=/path/to/rcfile sh

特定變數需要在命令行上聲明 - 如上所述$ENV- 或者使用export. 例如,$PATH你這樣做:

export "PATH=$PATH:/some/more/paths"; sh

您引用的$BASH_ENV變數不是您需要獲取的文件 - 並且在bash被呼叫時無論如何都不會被解釋為sh- 而是在呼叫非互動式bashshell 時獲取的文件的路徑 - 例如使用腳本指定:

#!/bin/bash

…或任何爆炸線。

您可能希望呼叫腳本/shell 的另一種方法是使用該env實用程序。它可用於從環境中顯式刪除值,或者通常最簡單的方法是從一開始就將其擦除:

env - BASH_ENV=/path/to/rcfile /usr/bin/bash /some/script/file

這將告訴env呼叫/usr/bin/bash命令 - 附加其所有參數 -$BASH_ENV指定環境變數,否則完全使用乾淨的環境。

引用自:https://unix.stackexchange.com/questions/158117