#! /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 通配模式的单词(例如,??
当当前目录中不存在具有两个字符文件名的文件时)。
做你想做的事情的更好(更安全)的方法是使用pkill
asCraig 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)'