如何设置适用于所有地方的变量?我的.bashrc有:
Questions='/Users/User/Stackoverflow/Questions'
Address='My address'
我的档案有:
$Questions
$Addres
Shell中的命令“$ cat my_file”打印“$ Questions”和“$ Address”,而不是“/ Users / User / Stackoverflow / Questions”和“My address”。我想要变量的其他地方是电子邮件和浏览器。但我不能让他们工作。
如何让我的变量在每个程序中都有效?
答案 0 :(得分:5)
cat
不解释变量。它只是逐字节地打印出文件的内容。
如果您希望能够使用my_file
打印出变量的值,我建议您将其更改为
echo "$Questions"
echo "$Address"
然后你可以使用
“获取”它(有点像在当前的shell环境中运行它)$ source my_file
或
$ . my_file
您可能还必须在export
中使用.bashrc
,如下所示:
export Questions='/Users/User/Stackoverflow/Questions'
export Address='My address'
答案 1 :(得分:2)
如何让我的变量在每个程序中都有效?
你做不到。 Bash和cat是两个独立的程序。你设置了一个bash变量,它并不意味着cat会像bash一样解释它。 $VARNAME
是一个shell语法,cat是一个不同的程序,几乎与shell无关。
您可以将shell变量导出为环境变量,但cat不会被编程为替换任何文本模板,它会超出其目的。
相反,您可以使用sed
来执行文本模板替换:
sed -e "s|@QUESTIONS@|$Questions|g; s|@ADDRESS@|$Address|g" file.txt
这将使用@QUESTIONS@
和@ANSWERS@
shell变量的内容替换文件中$Questions
和$Address
的所有实例。请注意,这些shell变量不能包含任何管道(“|”)符号,因为建议将它们用作分隔符。
答案 2 :(得分:2)
你可以使用一些讨厌的hackery来获取“猫”的东西:
eval“$(printf'cat<< END \ n%s \ nEND'”“$(< foo)”)“
其中“foo”是包含文本的文件,您希望从中扩展bash参数。这个解决方案基本上只是将文本转换为here文档,这会扩展bash参数。
cat <<END
[your text]
END
限制:
你不能在文本文件中只有一行“END”,否则解决方案就会中断。它会认为文本文件中带有“END”的行结束了此文档而不是printf命令中的END,并且输出将提前结束。
TBH:
这是你不应该做的事。如果您想制作模板文件,请找一个为此构建的模板系统。你不应该强迫bash做一些不能做的事情。它是一种脚本语言,而不是模板系统。它构建用于使用定义良好的语法解析脚本,而不是任意文本文件。
答案 3 :(得分:1)
你做不到。为了做到这一点,你需要每个电子邮件客户端编写者,每个浏览器编写者,每个实用工作者的合作。
答案 4 :(得分:0)
输入env
查看变量是否存在。
如果是,请尝试使用${VAR_NAME}
调用它们。
重新迭代后,我现在看到你的问题。你不能拥有一个文本文件,cat
它的内容并期望解析环境变量。你不能。
如果它是一个bash脚本文件,并且你要运行它,你可以echo
输出变量,它们将被解析为你想要的。
答案 5 :(得分:0)
来自您对Paul Tomblin's answer的评论:
你确定吗?我听说你可以在Emacs中拥有像RSS阅读器这样的东西。或许,有更好的合作。我是VIM用户,所以我不知道。如果有人知道Emacs是否在计划之间有很好的合作,请不要犹豫,分享您的知识。 - UnixBasics(3分钟前)
你想要(或者你会满意)一个可以扩展环境变量的编辑器吗?
这是一个不同的(即更简单,可能)问题。
在纯粹的理论层面上,我认为黑客文件系统可以做你想要的,但它肯定会打破各种二进制存储。因此,我们为文本(可扩展)和非文本文件类型添加文件系统标志。我们需要一种方法让文件系统知道要扩展的变量集,以及令人作呕的......
答案 6 :(得分:0)
只需添加到〜/ .profile或〜/ .bashrc:
export Questions='/Users/User/Stackoverflow/Questions'
export Address='My address'