Shell 在zsh中复制环境变量
我用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
~ ❯ 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脚本读取了第二条路径。谢谢,解释得很好。谢谢