尝试运行:
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。