随处可见的变量

时间:2009-03-22 16:08:13

标签: bash unix variables

如何设置适用于所有地方的变量?我的.bashrc有:

Questions='/Users/User/Stackoverflow/Questions'

Address='My address'

我的档案有:

$Questions
$Addres

Shell中的命令“$ cat my_file”打印“$ Questions”和“$ Address”,而不是“/ Users / User / Stackoverflow / Questions”和“My address”。我想要变量的其他地方是电子邮件和浏览器。但我不能让他们工作。

如何让我的变量在每个程序中都有效?

7 个答案:

答案 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'