当我运行此脚本时,为什么会收到设置不匹配的消息?

当我运行此脚本时,为什么会收到设置不匹配的消息?
#! /usr/bin/tcsh -f

set ps_output = "`ps -u $user`"
@ i = 2

echo "$ps_output"

set ps_test

while ( $i <= $#ps_output )
    set line = ( $ps_output[$i] )
    if ( $line[4] != "ps" && $line[4] != "tcsh" && $line[4] != "zap" ) then
        set ps_test = ( $ps_test $i )
    endif
    @ i ++
end    

foreach i ( $ps_test )
    set line = ( $ps_output[$i] )
    set process_no = $line[1]
    if ( $line[4] == "HAL9000" || $line[4] == "HALos" || $line[4] == "HALshell" || $line[4] == "HALkeyboardDriv" || $line[4] == "HALdisplayDrive" || $line[4] == "HALdiskDriver" ) then
        kill -9 $process_no
    endif
end


exit 0

所以我在我的脚本中不断收到设置不匹配错误,但我找不到哪个设置负责,我的意思是即使我注释掉 set ps_test,我仍然得到设置不匹配错误,有没有办法解决这个问题

答案1

set你会从第一个循环中得到这个错误,

set line = ( $ps_output[$i] )

...如果输出ps包含不匹配的 shell 通配模式的单词(例如,??当当前目录中不存在具有两个字符文件名的文件时)。

做你想做的事情的更好(更安全)的方法是使用pkillasCraig Small 在他们的回答中表明,或者,稍微更具可读性,

pkill -x -u $user HAL9000 HALos HALshell HALkeyboardDrv HALdisplayDrive HALdiskDriver

-x强制整个命令名称精确匹配,而不仅仅是名称的任何子字符串),或者简单地

pkill -u $user '^HAL'

HAL向名称以属于用户的子字符串开头的任何进程发出信号$user

有关的:

答案2

另一种方法是在命令行或脚本中的一行上使用 pkill。

pkill -9 -u $USER '(HAL9000|HALos|HALshell|HALkeyboardDrv||HALdisplayDrive|HALdiskDriver)'

相关内容