Shell 在zsh中复制环境变量

Shell 在zsh中复制环境变量,shell,zsh,Shell,Zsh,我用zsh声明了两条路径。这是如何发生的/或我如何复制它 ~ ❯ env | grep -i path PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/texbin PATH=/usr/bin:/bin:/usr/sbin:/sbin 有很多方法可以复制这种输出 通过线馈送进行美容: % export foo=$'1\nfoo=2' % env | grep foo f

我用zsh声明了两条路径。这是如何发生的/或我如何复制它

~ ❯ env | grep -i path
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/texbin
PATH=/usr/bin:/bin:/usr/sbin:/sbin

有很多方法可以复制这种输出

通过线馈送进行美容:

% export foo=$'1\nfoo=2'
% env | grep foo
foo=1
foo=2
带回车的化妆品:

export foo=1
export bar=$'2\rfoo'
用不可打印的字符进行装饰:

env foo=1 $'foo\x01=2' zsh
但最有趣的方法是用同一个名称设置多个变量

人们通常没有意识到环境根本不是由变量组成的。它只是一个任意字符串的列表,通常不一定解释为
key=value

我们可以简单地添加两个字符串
foo=1
foo=2
,这取决于程序如何解释。一种方法是使用小型C程序:

int main() {
  char *argv[] = { "zsh", 0 };
  char *envp[] = { "foo=1", "foo=2", 0 };
  execvpe("zsh", argv, envp);
}
执行时,我们被放入一个shell,并设置了两个值:

% env | grep foo
foo=1
foo=2
您可以检查
env-0 | od-c
的输出,查看您当前正在经历上述哪种情况


作为奖励,让我们询问
zsh
bash
他们认为
$foo
的价值是什么:

% echo $foo
1
% bash -c 'echo $foo'
2
它们各自从环境中拾取不同的字符串

想象一下,如果安全性依赖于
zsh
包装过滤
bash
脚本的环境变量


这就是为什么人们永远不应该尝试重新发明sudo的众多原因之一。有很多方法可以重现这种输出

通过线馈送进行美容:

% export foo=$'1\nfoo=2'
% env | grep foo
foo=1
foo=2
带回车的化妆品:

export foo=1
export bar=$'2\rfoo'
用不可打印的字符进行装饰:

env foo=1 $'foo\x01=2' zsh
但最有趣的方法是用同一个名称设置多个变量

人们通常没有意识到环境根本不是由变量组成的。它只是一个任意字符串的列表,通常不一定解释为
key=value

我们可以简单地添加两个字符串
foo=1
foo=2
,这取决于程序如何解释。一种方法是使用小型C程序:

int main() {
  char *argv[] = { "zsh", 0 };
  char *envp[] = { "foo=1", "foo=2", 0 };
  execvpe("zsh", argv, envp);
}
执行时,我们被放入一个shell,并设置了两个值:

% env | grep foo
foo=1
foo=2
您可以检查
env-0 | od-c
的输出,查看您当前正在经历上述哪种情况


作为奖励,让我们询问
zsh
bash
他们认为
$foo
的价值是什么:

% echo $foo
1
% bash -c 'echo $foo'
2
它们各自从环境中拾取不同的字符串

想象一下,如果安全性依赖于
zsh
包装过滤
bash
脚本的环境变量


这是一个人永远不应该尝试重新发明
sudo

路径
的众多原因之一(如果有,考虑到另一个人的答案),如果你简单地键入
echo$PATH
,你会得到第一个。但是ruby脚本读取第二条路径。如果您只需键入
echo$PATH
,您会得到哪条路径(如果是,考虑到另一个人的答案),我会得到第一条路径。但是ruby脚本读取了第二条路径。谢谢,解释得很好。谢谢