函数定义

时间:2015-11-10 21:22:40

标签: unix terminal zsh zshrc oh-my-zsh

我发现这真的很整洁,但我没有足够的参与来弄清楚发生了什么。

有没有人知道为什么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(),然后用function>填写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

BUT

➜  ~  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中不起作用。

1 个答案:

答案 0 :(得分:0)

➜  ~  (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

ls:2: 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()定义发生了什么,但所有其他人都完全正常。例如,您可以定义函数" 9"这将命令命令" 13,"和zsh抱怨说没有名为" 13"所以它没有任何事情要做。

➜  ~  9()
function> 5
➜  ~  (9)
[1]    66979 segmentation fault  ( cd -9; )

老实说,我不知道这个是怎么回事。你使用的是zsh之类的旧版本吗?作为阅读此主题的其他人的旁注,当我尝试定义此主题时,返回提示需要很长时间 - 这与其他任何人都没有发生过,有人知道原因吗?

echo $JAVA_HOME()
echo "hi"

这和以前差不多。这将定义一个函数,可以通过" echo"来调用。或$ JAVA_HOME的值,如果设置为将调用" echo"这将呼叫" echo"这将调用" echo,"我们的堆栈再次溢出。

希望回答你的问题,如果你有任何问题,请随时提出来!