根据环境变量执行Bash运行命令

时间:2020-05-02 09:46:52

标签: bash environment-variables

请参阅“我要将文件复制到目标位置:cp filename /home/example/temp.txt

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

我想要的是别名alias cpf=cp ${filename} /home/nope/temp.txt到.bashrc,如果我想将最新的cpf复制到finename,则只需要运行/home/example/temp.txt


我尝试过的事情:

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

并且无法获得${filename}

是否有一些更改可以使我尝试的工作正常?

2 个答案:

答案 0 :(得分:2)

示例.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

在将其放入alias之前,请记住function可以做alias可以做的所有事情,并且可以做更多的事情。您“应该”停止使用alias
当您拥有三个或四个文件名(如filename1、1、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 2filename2调用该函数。
要将文件名放入环境中时,可以更改功能

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

答案 1 :(得分:1)

我的猜测是假设/home/example/.env包含:

#!/bin/bash
# bash sourcable file
filename=$(echo 123)

然后您要:

#!/bin/bash
cpf() {
   (
      . /home/example/.env
      cp "$filename" /home/nope/temp.txt
   )
}

注意:

  • eval是邪恶的。您使用eval $(grep...)非常危险。
  • 始终记住对您的扩展进行压缩。