我在同一目录下有两个脚本: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存储库之前对其进行了加密,但我不想加密启动文件,以便其他人也可以使用它。
1条答案
按热度按时间yiytaume1#
. ./latlong.sh
中的.
在某些shell中也称为source
。它所做的是告诉当前shell在当前shell中运行给定的脚本。
这意味着/bin/sh脚本中的这段代码将使用/bin/sh* 运行
latlong.sh
*,而不管它是如何运行的,因此它将运行这将把位置参数设置为
latlong
和x.xxxxxx:x.xxxxxx
。它在语法上是有效的,但在/bin/sh中的含义与在fish中的含义完全不同。当你在fish中运行. ./latlong.sh
时,fish将读取它并将set
解释为fish内置。简而言之:这里最简单的解决方案是用同一种语言编写两个脚本。这将允许您在同一个shell中
source
它们,保持变量不变。如果你的latlong.sh和你在这里展示的例子一样简单,那很容易:
或者你可以选择一种像csv或者json或者whathaveyou这样的数据格式,然后想办法把它们加载到任何shell中。
或者,您可以尝试direnv所做的相同事情,即在定义的shell中运行脚本(本例中为bash),然后diff the environment variables将它们应用到用户的shell中。
[0]:遗憾的是posix并不要求这样做,因此我们经常会遇到无法读取且容易丢失的
.
名称