【发布时间】:2015-11-10 21:22:40
【问题描述】:
我觉得这很整洁,但我参与的程度还不够,无法弄清楚发生了什么。
有谁知道为什么 zsh 中存在这种行为,或者 zsh 试图做什么导致段错误?
➜ ~ (echo "hi"(); echo "hi"; echo "hi")
[1] 65962 segmentation fault ( echo "hi" () { ... }; echo "hi"; )
➜ ~ (ls(); ls; ls)
[1] 66073 segmentation fault ( ls -G () { ... }; ls -G; )
我把它放在一个子进程中,以便它打印出发生了什么;否则,例如,如果你运行ls(),然后用ls 填写function>,然后再次运行ls,它会使终端崩溃。
仅当您尝试用自己重新定义函数时才会发生这种情况,例如 echo str1(); echo str2,而不是 ls(); echo str。它不适用于所有可能的输入,而仅仅是因为语法解析,例如,虽然:
➜ ~ (^A(); ^A; ^A)
[1] 66154 segmentation fault ( ^A () { ... }; ^A; )
如果您逐行运行,由于语法原因,这不起作用:
➜ ~ ^A()
zsh: substitution failed
奇怪的是,会出现这样的行为:
➜ ~ a()
function> 7
➜ ~ a
a:cd:3: no such entry in dir stack
➜ ~ 8()
function> b
➜ ~ 8
cd:7: command not found: b
➜ ~ 9()
function> 13
➜ ~ 9
cd:6: command not found: 13
但是
➜ ~ 9()
function> 5
➜ ~ (9)
[1] 66979 segmentation fault ( cd -9; )
如果不在子进程中会导致终端崩溃,这意味着 您可以将一位数定义为指向两位数但不能指向一位数的函数 !这等效于字母(c(); a 是段错误制造者,c(); bh 是“未找到命令”)。 71(); 81; 71; 也不会导致段错误。
我很好奇引擎盖下出了什么问题!它确实提供了一种令人讨厌的与人相处的方式,因为把
echo $JAVA_HOME()
echo "hi"
在.zshrc 中即使有人只尝试使用 $JAVA_HOME 也会使终端崩溃,比如说,变量赋值,它会导致段错误,例如,
➜ ~ ($JAVA_HOME)
[1] 66745 segmentation fault ( $JAVA_HOME; )
➜ ~ (X= $JAVA_HOME)
[1] 66737 segmentation fault ( X= $JAVA_HOME; )
也许这也需要一个补丁,因为我可以想象这可能会出于粗鲁的目的而被利用。这是一个已知问题吗?
由于 bash 解析函数定义的方式,它在 bash 中不起作用。
【问题讨论】:
-
(echo hi(); echo hi; echo hi)的东西可能是一个错误,但关于单个数字和双数字:您的单个数字可能都别名为cd +$digit(或cd -$digit)。检查alias 1、alias 2、...、alias 9,您会发现这是您的配置框架中的一个技巧(在 Prezto 中它位于directory中)。我仍然不清楚为什么会触发段错误;可能也是一个错误。向 zsh-workers@zsh.org 报告。 -
你真的应该在 zs-workers@zsh.org 提交一个错误
-
请注意,有一个段错误是一个错误。干净利落。如果语法错误或用户做了一些有趣的事情,shell 应该打印一个错误,而不是崩溃。
标签: unix terminal zsh zshrc oh-my-zsh