如何將環境變數傳遞給非互動式外殼(帶有範例)?
在 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
- 而是在呼叫非互動式bash
shell 時獲取的文件的路徑 - 例如使用腳本指定:#!/bin/bash
…或任何爆炸線。
您可能希望呼叫腳本/shell 的另一種方法是使用該
env
實用程序。它可用於從環境中顯式刪除值,或者通常最簡單的方法是從一開始就將其擦除:env - BASH_ENV=/path/to/rcfile /usr/bin/bash /some/script/file
這將告訴
env
呼叫/usr/bin/bash
命令 - 附加其所有參數 -$BASH_ENV
指定環境變數,否則完全使用乾淨的環境。