Questions tagged «environment-variables»

对于与环境变量有关的问题,一组动态变量可能会影响正在运行的进程的行为和对资源的访问。使用此标记可解决有关环境变量的问题,或有关在运行过程行为和对资源的访问中因设置或修改变量值的影响而引起的问题的问题。

5
Shell变量可以具有哪些作用域?
我只是遇到一个问题,表明我不清楚shell变量的范围。 我试图使用bundle install,这是一个Ruby命令,使用的值$GEM_HOME来完成其工作。我已经设置了$GEM_HOME,但是命令忽略了这个值,直到我使用为止export,如上图所示export GEM_HOME=/some/path。 我读到这使变量以某种方式成为“全局”(也称为环境变量),但是我不明白那是什么意思。我了解编程方面的全局变量,但不涉及不同的程序。 而且,鉴于我对此类变量的设置仅适用于当前的shell会话,我将如何为守护进程设置它们? Shell变量可以具有哪些作用域?

5
环境变量到底是什么?
我知道这VARIABLE=value会创建一个环境变量,并export VARIABLE=value使它可用于当前shell创建的进程。env显示当前的环境变量,但是它们住在哪里?什么包括环境变量(或就此而言,环境)?

1
导出的外壳变量与未使用bash的外壳变量之间的区别
Bash似乎可以区分已导出和未导出的变量。 例: $ FOO=BAR $ env | grep FOO $ set | grep FOO FOO=BAR set看到变量,但env看不到。 $ export BAR=FOO $ env | grep FOO BAR=FOO $ set | grep FOO BAR=FOO FOO=BAR set查看两个变量,但env仅查看导出的变量。 我知道那set是内置的bash,env不是。 导出的变量与未导出的变量之间有什么区别?

3
.bash_profile在运行su时未获得
例如,我有一个用户user1对其进行了修改.bash_profile,其中之一更改了PATH,例如:export PATH=/some/place:$PATH。如果我以user1或身份登录,则此更改效果很好su - user1。 但是,如果我尝试通过suas 运行命令root,例如: su -c test.sh oracle (测试包含echo $PATH) 它似乎没有修改PATH(或root的修改PATH)。我也尝试过复制.bash_profile到.profile,但无济于事。 为什么会这样呢?

5
用实际值替换文件中的环境变量?
有没有一种简单的方法可以替换/评估文件中的环境变量?假设我有一个config.xml包含以下内容的文件: <property> <name>instanceId</name> <value>$INSTANCE_ID</value> </property> <property> <name>rootPath</name> <value>/services/$SERVICE_NAME</value> </property> ...等等。我想$INSTANCE_ID用INSTANCE_ID环境变量$SERVICE_NAME的值和SERVICE_NAMEenv var 的值替换文件。我不会事先知道需要哪个环境变量(或者,如果有人将新的环境变量添加到配置文件中,我不想更新脚本)。谢谢!


5
sudo如何设置为在Ubuntu中不更改$ HOME以及如何禁用此行为?
在Ubuntu 12.04上,当我sudo -s不更改$ HOME变量时,因此如果我的普通用户是regularuser,情况将如下所示: $ cd $ pwd /home/regularuser $ sudo -s # cd # pwd /home/regularuser 我很早以前就放弃了Ubuntu,所以不能确定,但​​是我认为这是默认行为。因此,我的问题是: Q1。怎么做?配置在哪里? Q2。如何禁用它? 编辑: 感谢您的答案,这使事情有所澄清,但我想我必须添加几个问题,才能得到我想要的答案。 Q3。在Debian中sudo -s,将$ HOME变量更改为/root。从答案中得到的结果和man sudo运行的shell sudo -s是给定的/etc/passwd,对吗? Q4。但是,在Ubuntu和Debian上/etc/passwd,root用户指定的shell 是/bin/bash。在这两个系统中,就$ HOME而言,我都找不到文件.profile或.bashrc文件中的差异所在的位置,从而使行为sudo -s不同。有什么帮助吗?

7
通过sudo和su运行时,为什么PATH变量不同?
在我的fedora VM上,使用用户帐户运行时/usr/local/bin,我的路径是: [justin@justin-fedora12 ~]$ env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin 同样在运行时su: [justin@justin-fedora12 ~]$ su - Password: [root@justin-fedora12 justin]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin 但是,当通过运行时sudo,该目录不在路径中: [root@justin-fedora12 justin]# exit [justin@justin-fedora12 ~]$ sudo bash [root@justin-fedora12 ~]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin 为什么通过via运行时路径会有所不同sudo?


3
导出其中带有点(。)的变量
如何导出其中带有点的变量。我尝试时得到“无效的变量名”: export my.home=/tmp/someDir -ksh: my.home=/tmp/someDir: invalid variable name 即使转义元字符点(。)也无济于事 $ export my\.home=/tmp/someDir export: my.home=/tmp/someDir: is not an identifier


5
重新连接时,为什么必须在tmux中重新设置环境变量?
我主要在Mac上工作,并将ssh / tmux附加到Linux机器上以完成工作。我在Linux机器上运行ssh-agent。我有 set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" 在我的.tmux.conf。然而,每当我重新参加本次会议时,我都必须跑步 tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK 为了$SSH_AUTH_SOCK正确设置新的tmux窗口。我希望不必这样做。有任何想法吗? 更新资料 我想我的解释不太好。这是我的shell函数,用于在远程计算机上打开shell: sshh () { tmux -u neww -n ${host} "ssh -Xt ${host} $*" } 当TMUX运行此ssh命令,$SSH_AUTH_SOCK是没有设置,即使是在我的本地环境设置。如果使用setenv上面的命令将其放在tmux的环境中,则一切正常。我的问题是,为什么我必须完全运行setenv命令? 更新2 更多信息: 当我附加到现有会话时,$SSH_AUTH_SOCK未在tmux环境(或全局环境)中设置。 % tmux showenv | grep -i auth_sock -SSH_AUTH_SOCK 如果我手动设置它,则工作正常: % tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK …

4
谁设置$ USER和$ USERNAME环境变量?
另外,这些变量是否总是匹配当前登录的用户名(在我的Debian系统上是这样)?我可以假定它们在其他类Unix系统中可用吗? 我也很好奇为什么会使用whoami而不是仅仅读取这些变量中的任何一个。

3
使用变量存储PS1的终端颜色代码?
在我的文章中.bashrc,我使用ANSI终端颜色代码对各个位进行着色。看起来像这样: PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ ' 其中virtual_env和git_branch是在stdout上输出内容的bash函数。 现在,为了使其更易于阅读和修改,我想将颜色代码存储在变量中并对其进行引用,而不是将它们直接嵌入PS1。所以我有一堆这样的变量: GREEN="\[\033[32m\]" YELLOW="\[\033[33m\]" RESET="\[\033[0m\]" 我希望能够编写如下内容: PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ ' 但这是行不通的-提示中会显示颜色代码,就像逃脱了一样。如果我使用双引号代替PS1,则颜色可以正常工作,但是提示仅在我这样做时才会更改source ~/.bashrc。 我已经试过我见过的人做其他事情-使用printf,使用单引号的颜色,把\[和\]中PS1,而不是颜色可变的,但似乎没有任何工作。 如何将变量用于颜色代码?

7
Shebang中的多个论点
我想知道是否存在通过shebang行(#!)将多个选项传递给可执行文件的一般方法。 我使用NixOS,在我编写的任何脚本中,shebang的第一部分通常是/usr/bin/env。然后我遇到的问题是,系统将所有后续内容解释为单个文件或目录。 例如,假设我想编写一个bash在posix模式下执行的脚本。编写shebang的幼稚方式是: #!/usr/bin/env bash --posix 但是尝试执行生成的脚本会产生以下错误: /usr/bin/env: ‘bash --posix’: No such file or directory 我知道这篇文章,但我想知道是否有更通用,更清洁的解决方案。 编辑:我知道对于Guile脚本,有一种方法可以实现我想要的内容,在手册的4.3.4节中进行了介绍: #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# 这里的窍门是,第二行(以开头exec)被Guile解释器解释为代码,sh但在#!... !#块中但作为注释,因此被忽略。 不可能将这种方法推广到任何解释器吗? 第二次编辑:经过一番摸索之后,对于可以从中读取输入内容的解释器来说stdin,以下方法可行: #!/usr/bin/env sh sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit; 但是,这可能不是最佳的,因为该sh过程一直持续到口译员完成工作为止。任何反馈或建议,将不胜感激。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.