bash:.bashrc 中的环境变量

bash: environmental variables within .bashrc

提问人:James Starlight 提问时间:10/19/2023 最后编辑:James Starlight 更新时间:10/19/2023 访问量:56

问:

以下 bash 函数定义了两个环境变量,它们将与位于外部 USB 上的脚本 test.sh 一起使用。

quick_function(){

export curent_dir=$(pwd)
export ref_folder="${home}"

local quick_path=$(find /media/$USER -type f -name test.sh)

# run script located on the usb stick from the current directory
chmod +x "$quick_path"
"$quick_path"

}

目的是在当前目录中产生一些test_dir(而不是在 script.sh 所在的 U 盘上)。这是 test.sh

# the both input paths are commented since they have been already provided in the function defined in .bashrc
#curent_dir=$(pwd)
#ref_folder="${home}"
mkdir "$ref_folder"/test_dir

出于测试目的,我取消了 test.st 中定义的 $curent_dir 和 $ref_folder 的注释,并且(令人惊讶地)发现从 quick_function () 调用的脚本仍然在我打开终端的任何地方产生test_dir(并且从未在 U 盘上......

这是否意味着在这个例子中,我不需要在函数中导出两个环境变量,或者这些变量总是在随后执行的脚本中定义的变量(具有相同的名称)上从同一函数?

bash 变量

评论

1赞 Charles Duffy 10/19/2023
请注意,设置环境变量被认为是不好的形式 - 传统上,它们属于 ,而应该用于需要为每个启动的新交互式 shell 重新建立的东西。.bashrc.bash_profile.bashrc
1赞 Charles Duffy 10/19/2023
顺便说一句,这有什么意义?该脚本使用与当前 shell 相同的方式运行(并且更喜欢 ,而不是 -- 运行速度更快),因此它可以检查工作目录本身,而不是需要继承它。export curent_dirquick_path$PWD$PWD$(pwd)
2赞 Charles Duffy 10/19/2023
运行位于其他位置的可执行文件不会更改当前目录;如果您位于 并运行 ,则会列出 中的文件,而不是 中的文件。对于您自己创建的可执行文件(如脚本)也是如此。~/bin/ls~/bin
1赞 Charles Duffy 10/19/2023
如果运行 ,这将更改在它之后运行的内容的当前工作目录。如果你不执行 -- 就像执行的那样 -- 那么你的主目录将仍然是默认的工作目录,其他一切都相对于它发生。cd /somewhere/elsechdir()cd
1赞 Charles Duffy 10/19/2023
如果人们想要更改它并使脚本相对于其自己的位置运行,他们需要做一些额外的工作,就像 BashFAQ #28 中描述的那样。

答:

1赞 Socowi 10/19/2023 #1

导出似乎还可以。我假设,问题出在()上。这看起来好像您假设该变量将包含主目录的路径(例如)。但是,打印当前目录的路径,因此新目录的位置将始终位于工作目录中。exporthome=$(pwd)home/home/yourusername/pwd

无论哪种方式,您都不需要环境变量。

  • 要在工作目录中创建新目录,请使用mkdir test_dir
  • 要在主目录中创建新目录,请使用 或 .mkdir ~/test_dirmkdir "$HOME/test_dir"

在我打开终端的任何地方产生test_dir(而不是在 U 盘上......

听起来您想在 U 盘上创建新目录,就在 旁边。在那种情况下......test.sh

  • 你可以在你的 after 被定义和 before 被调用export ref_folder="$(dirname "$quick_path")"quick_function()quick_pathtest.sh
  • 但是,在内部使用会更容易,而不是手动处理该变量。dirname$0$BASH_SOURCEtest.shref_folder

出于测试目的,我取消了 test.st 中定义的 $home 和 $ref_folder 的注释,并发现从 quick_function() 调用的脚本仍然在我打开终端的任何地方生成test_dir

因为这些变量的定义是相同的。

这是否意味着 [...][exported] 变量总是从同一函数的后续执行脚本中定义的变量(具有相同的名称)?

反之亦然!最内层作用域 (test.sh) 中的变量会隐藏从外部作用域 (quick_function()) 导出的变量。

评论

0赞 James Starlight 10/19/2023
谢谢!实际上问题是,原则上我是否需要在从同一函数调用的 sh 脚本中已经定义的导出 var?我刚刚在我的 mac 上测试了它,并注意到环境变量确实不是必需的,并且test_dir将始终在我运行该函数的地方创建。
1赞 Socowi 10/19/2023
@JamesStarlight 是否需要某件事,只有在我们知道您的目标时才能回答。从你的问题中,我只能猜测那个目标是什么。如果您需要更多答案,请在问题中定义您的目标(使用编辑按钮)。
0赞 James Starlight 10/19/2023
目标是在我打开temrinal的任何当前目录中创建任何输出填充,而不是在脚本所在的U盘上
1赞 Charles Duffy 10/19/2023
@JamesStarlight,如果要在打开终端时记录这些值,则希望在函数范围之外记录它们(该函数稍后在调用时运行,而不是在首次打开终端时运行)。
1赞 Charles Duffy 10/19/2023
@JamesStarlight,...也就是说,您的主目录(当您在传统环境中启动新终端时,这将是当前的工作目录)只是;为什么要用另一个副本存储其他东西?$HOME