Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 奇怪的zsh segfault故障与函数定义_Unix_Terminal_Zsh_Zshrc_Oh My Zsh - Fatal编程技术网

Unix 奇怪的zsh segfault故障与函数定义

Unix 奇怪的zsh segfault故障与函数定义,unix,terminal,zsh,zshrc,oh-my-zsh,Unix,Terminal,Zsh,Zshrc,Oh My Zsh,我觉得这真的很好,但我没有参与到足够的事情中去弄清楚发生了什么 有人知道为什么zsh中存在这种行为,或者zsh试图做什么导致segfault吗 ➜ ~ (echo "hi"(); echo "hi"; echo "hi") [1] 65962 segmentation fault ( echo "hi" () { ... }; echo "hi"; ) ➜ ~ (ls(); ls; ls) [1] 66073 segmentation fault ( ls -G ()

我觉得这真的很好,但我没有参与到足够的事情中去弄清楚发生了什么

有人知道为什么zsh中存在这种行为,或者zsh试图做什么导致segfault吗

➜  ~  (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
填写
函数>
,然后再次运行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
但是

如果不在子进程中,这将使终端崩溃,这意味着您可以将一个单位数定义为指向两位数的函数,但不能指向一个单位数的函数!这相当于字母(
c();a
是segfault生成器,
c();bh
是“未找到命令”)<代码>71();81; 71;也不会导致SEG故障

我很好奇引擎盖下到底出了什么问题!它确实提供了一种令人讨厌的与人交往的方式,因为

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")
[1]    65962 segmentation fault  ( echo "hi" () { ... }; echo "hi"; )

➜  ~  (ls(); ls; ls)
[1]    66073 segmentation fault  ( ls -G () { ... }; ls -G; )
对于我的zsh,这张照片

echo:1: maximum nested function level reached

分别



让我们来看看它们在做什么。什么

echo "hi"(); echo "hi"; echo "hi"
我们实际上正在做的是:

# Define functions "echo" and "hi" that will both execute the following code when called
function echo hi() {
    # These are what the function actually contains.  This means that inside of "echo," will be another "echo" that is calling the first echo with a (discarded) $1 of "hi."  Recursion!
    echo hi
}
# We haven't tripped up yet: we have yet to actually *call* this code.
echo "hi"
# And now we have.  Echo calls echo which calls echo, recursing too many times for zsh to handle.  This is known as "Stack Overflow," which is incidentally also the name of this site.
“ls”和“^A”的情况也差不多。



➜  ~  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
我不知道
a()。例如,您正在定义将调用命令“13”的函数“9”,而zsh抱怨没有名为“13”的命令,因此它没有任何事情要做。


我真的不知道这是怎么回事。您使用的是非常旧的zsh版本还是什么?作为阅读此线程的其他人的旁注,当我试图定义此线程时,需要很长时间才能返回到提示--其他线程中没有出现这种情况,有人知道原因吗?

这和以前差不多。这将定义一个函数,可由“echo”或$JAVA_HOME值调用,如果将其设置为调用“echo”,将调用“echo”,将调用“echo”,那么堆栈将再次溢出




希望这能回答您的问题,如果您还有问题,请随时提问

对于我的zsh,这张照片

echo:1: maximum nested function level reached

分别



让我们来看看它们在做什么。什么

echo "hi"(); echo "hi"; echo "hi"
我们实际上正在做的是:

# Define functions "echo" and "hi" that will both execute the following code when called
function echo hi() {
    # These are what the function actually contains.  This means that inside of "echo," will be another "echo" that is calling the first echo with a (discarded) $1 of "hi."  Recursion!
    echo hi
}
# We haven't tripped up yet: we have yet to actually *call* this code.
echo "hi"
# And now we have.  Echo calls echo which calls echo, recursing too many times for zsh to handle.  This is known as "Stack Overflow," which is incidentally also the name of this site.
“ls”和“^A”的情况也差不多。



➜  ~  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
我不知道
a()。例如,您正在定义将调用命令“13”的函数“9”,而zsh抱怨没有名为“13”的命令,因此它没有任何事情要做。


我真的不知道这是怎么回事。您使用的是非常旧的zsh版本还是什么?作为阅读此线程的其他人的旁注,当我试图定义此线程时,需要很长时间才能返回到提示--其他线程中没有出现这种情况,有人知道原因吗?

这和以前差不多。这将定义一个函数,可由“echo”或$JAVA_HOME值调用,如果将其设置为调用“echo”,将调用“echo”,将调用“echo”,那么堆栈将再次溢出





希望这能回答您的问题,如果您还有问题,请随时提问

(echo-hi();echo-hi;echo-hi)
这件事可能是个错误,但是关于一位数和两位数:您的一位数可能都被别名为
cd+$digit
(或
cd-$digit
)。选中
alias 1
alias 2
,…,
alias 9
,您将从您的配置框架中意识到这是一个技巧(在Prezto中,它位于
目录
)。我仍然不清楚为什么会触发SEGFULT;可能也是一个bug。向zsh报告-workers@zsh.org.You真的应该在zs提交一个bug吗-workers@zsh.orgPlease请注意,有一个segfault是一个bug。简单明了。如果语法错误或用户做了一些有趣的事情,shell应该打印一个错误,而不是崩溃。
(echo hi();echo hi;echo hi)
可能是一个错误,但是关于一位数和两位数:您的一位数可能都被别名为
cd+$digit
(或
cd-$digit
)。选中
alias 1
alias 2
,…,
alias 9
,您将从您的配置框架中意识到这是一个技巧(在Prezto中,它位于
目录
)。我仍然不清楚为什么会触发SEGFULT;可能也是一个bug。向zsh报告-workers@zsh.org.You真的应该在zs提交一个bug吗-workers@zsh.orgPlease请注意,有一个segfault是一个bug。简单明了。如果语法错误或者用户做了一些有趣的事情,shell应该打印一个错误,而不是崩溃。