首页 > 解决方案 > bash 根据环境变量运行命令

问题描述

请参阅我想将文件复制到目的地:cp filename /home/example/temp.txt.

filename某些程序会更改问题,并将其新名称写入文件中/home/example/.env

我想要的是alias cpf=cp ${filename} /home/nope/temp.txt.bashrc 之类的别名,然后我只需要cpf在我想将最新的复制finename到.bashrc 时运行/home/example/temp.txt


我试过的:

eval $(grep -v "^#" "/home/example/.env") cp ${filename} /home/nope/temp.txt

并未能得到${filename}

是否有一些改变可以使我尝试过的工作?

标签: bashenvironment-variables

解决方案


示例.env

key1='do not put me in the environment'
key2=1231
filename=thisvaluechanges
key4="I hate being evaluated"

您只想用 评估行filename。首先测试如何选择该行,例如

grep "^filename=" /home/example/.env
# or
sed -n 's/^\s*filename\s*=\s*/filename=/p' /home/example/.env

接下来,您可以source选择行。

source <(grep "^filename=" /home/example/.env)

当文件名是固定字符串时(无需$()评估),您可以不使用source

cp $(grep "^filename=" /home/example/.env) /home/nope/temp.txt

在将其放入 an 之前alias,请记住 a functioncan do an aliascan,并且可以做更多事情。您“应该”停止使用alias.
当您有三个或四个文件(如 filename1、2、3、4)时,您可以使用带参数的函数:

cpf() {
   if (( $# = 0 )); then
      echo "Usage: cpf filenumber"
   else
      cp $(grep "^filename${1}=" /home/example/.env) /home/nope/temp.txt
   fi
}

cpf 2您可以使用for调用该函数filename2
当您想将文件名放入环境中时,您可以更改功能

source <(grep "^filename${1}=" /home/example/.env)

推荐阅读