为了使我的环境可部署,我偶尔会压缩一些方便的文件和脚本:
tar -czvf env.tgz .vimrc .vim/ bin/lsl bin/s
我想添加.bashrc
到其中,但其中有一些敏感信息,因此我维护.bashrc-deploy
这些信息,然后一旦 tarball 位于新服务器上,我就可以简单地重命名。但是,我真的希望 tarball.bashrc
从一开始就有正确的名称,这样我就不必重命名。我考虑编写一个脚本来临时重命名文件并制作 tarball,如下所示:
#!/bin/bash
mv .bashrc .bashrc-real
mv .bashrc-deploy .bashrc
tar -czvf env.tgz .bashrc .vimrc .vim/ bin/lsl bin/s
mv .bashrc .bashrc-deploy
mv .bashrc-real .bashrc
但是,是否tar
有任何内部方法可以将someFile
名称存储anotherName
在 tarball 中?
答案1
使用pax
(创建tar
档案的标准(POSIX)命令)并bsdtar
查看-s
选项:
pax -s '/\.bashrc-deploy/.bashrc/' -w -x ustar . | gzip > a.tar.gz
bsdtar -s '/\.bashrc-deploy/.bashrc/' -zcf a.tar.gz .
但请注意,上面的代码会将.bashrc-deploy
字符串替换为.bashrc
要添加到存档中的任何成员的任何文件路径中的字符串。如果你只想替换./.bashrc-deploy
当前目录中的,你必须这样写:
pax -s '|^\./\.bashrc-deploy$|./.bashrc|' -w -x ustar .
(尽管通过阅读 POSIX pax 规范,我不确定它是否能保证每个 pax 实现都能以这种方式工作。它应该与 bsdtar 一起工作,因为只有一个实现)。
答案2
实现此目的的一种方法是链加载。
在.bashrc
:
#!/bin/bash
# ...
# Non-private information
# ...
[[ -r ~/.bashrc-private ]] && . ~/.bashrc-private
然后(仅)将您的私人内容放入其中~/.bashrc-private
,将其他所有内容放入~/.bashrc
.然后部署即可~/.bashrc
。
答案3
使用 GNU tar(非嵌入式 Linux 和 Cygwin 上的默认 tar 实现):
tar czf env.tgz --transform 's/-deploy$//' .bashrc-deploy .profile …
使用 pax(cpio 和 tar 的 POSIX 替代品)也可以实现这一点,不幸的是,许多默认的 Linux 安装中都没有它,BSD tar 也是如此:
pax -w -x ustar '-s/-deploy$//' .bashrc-deploy .profile … | gzip >env.tgz
bsdtar -czf env.tgz '-s/-deploy$//' .bashrc-deploy .profile …
在所有三种情况下,语法与ors/REGEX/REPLACEMENT/
相同。ed
sed
我质疑你的做法。在不同的机器上拥有相同名称但内容不同的文件很难维护。此外,如果某些文件必须保持私密,就很容易出错。我的建议是将配置文件存储在子目录中,并使用符号链接。例如, if.bashrc
必须是私有的且特定于站点的,并且.profile
必须是公共的并且在任何地方都相同:
.bashrc -> etc/local/private/.bashrc
.profile -> etc/.profile
创建etc/local
一个指向名称与站点相关的目录(例如~/etc/home
或~/etc/work
)的符号链接,确保~/etc/private
和~/etc/*/private
只能由您访问,然后就完成了。您可以部署整个~/etc
目录,并且只需要etc/local
在解压缩存档后设置符号链接(或者更好的是,从版本控制)。
对于类似 的文件.bashrc
(可能主要是与站点无关且公开的),请将文件分为两个(或最多四个)部分:公共部分和私有部分(如果需要,还可以加上站点特定的文件)。主要部分包括局部部分:
if [ -e ~/etc/private/.bashrc ]; then . ~/etc/private/.bashrc; fi
if [ -e ~/etc/local/.bashrc ]; then . ~/etc/local/.bashrc; fi
if [ -e ~/etc/local/private/.bashrc ]; then . ~/etc/local/private/.bashrc; fi
在用编程语言编写的文件中,您可以动态测试主机名或域名或其他与站点相关的特征,这使您可以维护单个文件。
case $HOSTNAME in
darkstar) alias foo=some-local-command;;
esac
里面有机密内容有点令人惊讶.bashrc
。如果您正在定义环境变量,他们属于~/.profile
。