在fish shell中从其他脚本获取变量的值

4ngedf3f  于 2023-04-12  发布在  Shell
关注(0)|答案(1)|浏览(110)

我在同一目录下有两个脚本:
latlong.sh

#!/bin/sh
set latlong 'x.xxxxxx:x.xxxxxx'

autostart_once.sh

#!/bin/sh
. ./latlong.sh
# some start up commands
redshift-gtk -l $latlong -t 6500:3600 &

然而,运行上面的autostart_once.sh会产生一个错误。看起来即使在获取latlong脚本后,latlong变量仍然是空的(我已经确保工作目录是www.example.com所在的目录latlong.sh)。但是,如果我在运行fishshell的终端中运行. ./latlong.sh,然后运行echo $latlong,变量设置正确。这里会发生什么?
几件事:
1.我不想在自动启动脚本之外访问变量。
1.我将latlong变量放到另一个文件中的原因是,我在将该文件推送到dotfiles存储库之前对其进行了加密,但我不想加密启动文件,以便其他人也可以使用它。

yiytaume

yiytaume1#

. ./latlong.sh中的.在某些shell中也称为source
它所做的是告诉当前shell在当前shell中运行给定的脚本。
这意味着/bin/sh脚本中的这段代码将使用/bin/sh* 运行latlong.sh *,而不管它是如何运行的,因此它将运行

set latlong 'x.xxxxxx:x.xxxxxx'

这将把位置参数设置为latlongx.xxxxxx:x.xxxxxx。它在语法上是有效的,但在/bin/sh中的含义与在fish中的含义完全不同。当你在fish中运行. ./latlong.sh时,fish将读取它并将set解释为fish内置。
简而言之:这里最简单的解决方案是用同一种语言编写两个脚本。这将允许您在同一个shell中source它们,保持变量不变。
如果你的latlong.sh和你在这里展示的例子一样简单,那很容易:

latlong=x.xxxxxx:x.xxxxxx

或者你可以选择一种像csv或者json或者whathaveyou这样的数据格式,然后想办法把它们加载到任何shell中。
或者,您可以尝试direnv所做的相同事情,即在定义的shell中运行脚本(本例中为bash),然后diff the environment variables将它们应用到用户的shell中。
[0]:遗憾的是posix并不要求这样做,因此我们经常会遇到无法读取且容易丢失的.名称

相关问题