请参阅“我要将文件复制到目标位置: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}
。
是否有一些更改可以使我尝试的工作正常?
答案 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 2
用filename2
调用该函数。
要将文件名放入环境中时,可以更改功能
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...)
非常危险。