이 스크립트를 실행할 때 설정 불일치 메시지가 나타나는 이유는 무엇입니까?

이 스크립트를 실행할 때 설정 불일치 메시지가 나타나는 이유는 무엇입니까?
#! /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셸의 와일드카드 패턴과 일치하지 않는 단어가 포함된 경우(예: ??두 문자로 된 파일 이름을 가진 파일이 현재 디렉터리에 없는 경우)

원하는 것을 수행하는 더 나은 (더 안전한) 방법은 다음 pkill과 같이 사용하는 것입니다.Craig Small이 답변에 표시됨또는 약간 더 읽기 쉽습니다.

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

( -x이름의 하위 문자열뿐만 아니라 전체 명령 이름이 정확히 일치하도록 강제) 또는 간단히

pkill -u $user '^HAL'

HAL이름이 user 에 속한 하위 문자열로 시작하는 모든 프로세스에 신호를 보냅니다 $user.

관련된:

답변2

또 다른 방법은 명령줄이나 스크립트의 줄에서 pkill을 사용하는 것입니다.

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

관련 정보