我正在研究一个 shell 脚本,当它第一次打开时会询问用户一些信息。此信息需要存储在配置文件中以供将来使用,以便用户不必在每次打开程序时都回答相同的问题。当然,我打算写一个if语句,每次使用脚本时检查配置文件中是否有信息,但我不知道如何创建配置文件。我想知道如何从 shell 脚本本身做到这一点,这样如果有人下载我的脚本并使用它,就会为他们创建配置文件。我还想知道如何将信息从脚本添加到配置文件中。谢谢你的帮助。
3 回答
我经常看到的一个解决方案是写出这样的配置文件:
cat <<EOF > ~/.app/config
var1=$var1
var2=$var2
EOF
然后,该配置文件本身就是一个适当的 shell 脚本,并且可以在启动时由 shell 脚本获取,如下所示:
[ -e ~/.app/config ] && source ~/.app/config
获取它(而不是将其作为命令执行)确保它定义的所有变量都将在获取它的脚本中可见。
然后,当然,您希望在采购之后,但在写出新版本之前进行用户导向的定制。
买者自负
使用这种方法可以用于快速脏的东西,或者只有你会触摸的东西。但是,获取脚本会在当前会话中运行其中的所有代码。这意味着它可以rm -rf /
,并且它还可以重新定义您在主脚本中定义的函数或变量,覆盖它们。
您可以使用如下代码:
RC_PATH="~/.myscriptrc"
echo $var1 > $RC_PATH
echo $var2 >> $RC_PATH
var1
并将var2
由换行符分隔并存储在~/.myscriptrc
配置文件中。因此,给定var1=Foo
和var2=Bar
, ~/.myscriptrc
文件将是:
Foo
Bar
又是一个认为 SO 是其个人发展中心的 OP。你甚至没有看其他与他类似的问题,比如:这个或这个等等。
因为你可能会遇到严重的麻烦,我会推荐你一个解决方案:
- 在 google 上搜索 bash 配置文件安全性
你会发现从来没有 source
任何配置变量,因为它很危险。例如,当你source
下一个配置文件时会发生什么?
MAINPATH=/some/path/here;rm -rf / &
所以,你应该
- 在代码中硬编码您的应用程序默认值,以及
- 并且在读取配置文件时,您必须确保保存的值不包含任何危险的东西(如上),因此不要包含字符
;
或反引号&
等。最好只包含 [A-Za-z0-9_/] 而不包含其他内容。这称为清理配置值。
最好的办法是使用更强大的配置文件解析工具,例如 perl、awk 等。
下一次,在这里提问之前使用谷歌或 SO 的搜索来获取答案
Ps:很抱歉这个消息,也许我是在心情不好的时候醒来的,但是开始对那些甚至没有尝试自己找到解决方案的 OP 生气......