命令不返回 .zshrc 内的预期值

命令不返回 .zshrc 内的预期值

尝试运行:

function which_terminal {
        return (ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11)
}

在 .zshrc 内获取运行终端模拟器的变量,以便我可以为不同的终端模拟器配置不同的主题。

当我在命令行中运行此命令时,我准确地得到了正在使用的模拟器。但是当我尝试将其添加到文件中时,我收到如下错误:

which_terminal:1: no matches found: (ps -p16632 | awk 'NR==2' | cut -d ' ' -f 11)

找不到哪里错了,如果有人可以帮忙

答案1

在 shell 中,函数的返回值就像命令的退出状态:只能返回一个小整数值,表示成功 (0) 或失败代码 (> 0)。

该状态与命令的输出无关。要运行命令并将其输出存储到变量中,请使用命令替换。要在函数中运行命令并将其输出作为函数的输出,只需运行该命令即可。

function which_terminal {
    ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11
}

请注意,解析 的输出ps是不可靠且过度的。 (另外,你弄错了:你正在解析'NR==2'toawk' 'to cut,这两个参数都是无效参数;你需要在每个参数周围加上单引号或双引号,而不是两者。)该ps命令有选项可以打印出你想要的任何字段,例如comm可执行文件的名称(在 Linux 下截断为 16 个字符)或args带有参数的完整命令行(有时是命令的完整路径,具体取决于调用方式)。

function which_terminal {
    ps -p$PPID -o comm=
}

或者,将输出存储到变量中:

parent_process_command=$(ps -p$PPID -o comm=)

您收到错误的原因是 zsh 试图解析后面的内容return作为命令的参数(这里是关键字的参数return,但它们以相同的方式解析)。它看到一个左括号并确定它是通配符表达式的开始。该通配符表达式将匹配名为ps -p16632, awk 'NR==2'or的文件cut -d -f 11(带有不在此呈现的前导/尾随空格),但由于您(毫不奇怪)没有具有任何这些名称的文件,zsh 抱怨它没有找到匹配项。return ?如果您碰巧3在当前目录中调用了一个文件,并且没有其他具有单字符名称的文件,则会返回 3。

相关内容