我将命令存储在一个文件中,由POSIX shell程序逐行读取和运行。它看起来像这样:
curl -fLo $HOME/.antigen.zsh git.io/antigen
curl -fLo $HOME/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
vim +"so $HOME/.vimrc" +PlugInstall +qa!
我还使用这个小函数体来遍历它并运行每一行:
while read -r line; do
$line
done < file
简单的东西。它起作用了!但是,我在将$HOME
扩展到我的主目录(以及~
(时遇到了问题。我已经尝试使用exec
子shell并从read
循环中删除-r
,但curl
语句创建了一个'$HOME'
目录,这不是我想要做的,我希望命令针对我的/home/.+/
目录。
由于这是一个奇怪的问题,你可能会在这一点上想知道(我当然会(,这不是一个XY问题。我花了相当长的时间来设计这一软件,我确信我需要将这些命令存储在一个文件中,以便我的程序运行,除非证明这是绝对不可能的,否则我不会考虑其他方式。此外,我不会自己扩展$HOME
,因为我希望这些命令能在其他用户的计算机上运行。
有什么想法吗?提前感谢!
将注释转换为答案
你能使用吗:
sh -c "$line"
或者:
eval $line
通常eval
被认为是危险的,但我不确定sh -c
有多大不同。仔细想想,为什么不简单地执行存储命令的文件呢?
sh "$file"
您可以使用sh -e "$file"
来停止未检查的错误,并添加-x
来查看正在执行的内容。