このスクリプトを実行すると設定の不一致メッセージが表示されるのはなぜですか?

このスクリプトを実行すると設定の不一致メッセージが表示されるのはなぜですか?
#! /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シェルのワイルドカードパターンと一致しない単語が含まれている場合(たとえば、??2文字のファイル名を持つファイルが現在のディレクトリにない場合)

必要なものを実行するより良い(より安全な)方法は、次のようpkillに使用することです。Craig Smallが回答に表示されますまたは少し読みやすいです。

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

-x名前の部分文字列だけでなく、コマンド名全体が正確に一致するように強制)または単に

pkill -u $user '^HAL'

HAL名前がuserに属する部分文字列で始まるすべてのプロセスにシグナルを送信します$user

関連:

おすすめ記事