이것은 잘 작동합니다:
#!/bin/sh
ALTER="$1"
NAME="$2"
for pr in $(pgrep $NAME); do
elapse=$(ps -o etime= -p $pr)
[ "${elapse%:*}" -gt "$ALTER" ] && echo $pr
done
하지만 CShell로 전환하려고 하면 다음과 같습니다.
#!/bin/csh
set ALTER = "$1"
set NAME = "$2"
for pr in $(pgrep $NAME); do
set elapse = $(ps -o etime= -p $pr)
[ "${elapse%:*}" -gt "$ALTER" ] && echo $pr
done
오류 가 발생합니다 Illegal variable
. 어떤 아이디어가 있나요?
답변1
스크립팅에 대해 가장 먼저 알아야 할 csh
것은일반적으로 매우 나쁜 생각입니다.. 즉, 주장한다면 스크립트의 문제는 다음과 같습니다.
csh
$()
명령 대체 구성 은 지원되지 않습니다 . 대신 사용하십시오` `
.csh
이for i ... do ... done
구문은 지원되지 않습니다. 대신 사용하세요foreach i ... end
.csh
문제"${elapse%:*}"
를 해결하려면 다른 도구를 사용해야 합니다.[
작업을 시작하는 방법을 모르겠습니다csh
(하지만 가능할 수도 있음). 해결 방법으로 를 사용하세요if
.
따라서 스크립트의 작업 버전은 다음 csh
과 같습니다.
#!/bin/csh
set ALTER = "$1"
set NAME = "$2"
foreach pr (`pgrep "$NAME"`)
set elapse = `ps -o etime= -p "$pr" | cut -d: -f1`
if ( "$elapse" > "$ALTER" ) echo "$pr"
end
하지만 심각하게 스크립트를 작성하지 마세요 csh
. 고통만 초래할 뿐입니다. 특히 실제로 필요한 것은 다음과 같습니다.
ps -o pid=,etime= -p $(pgrep $NAME) | cut -d: -f1 |
awk -vval="$ALTER" '$2>val{print $1}'
답변2
${var%$pattern}
에서 POSIX 쉘 구성(ksh에 의해 도입됨)입니다 csh
.
여기서 사용할 수 있습니다 expr
:
expr "$elapse" : '\([0-9]*\)' '>' "$ALTER" > /dev/null && echo $pr
하지만 먼저 내가 할게
- 피하다
csh
- 피하다
csh
- 쉘 스크립트에서 루프 방지. 여기에서는 대부분의 쉘과 호환되는 구문을 사용하여
ps
파이핑하여 모든 작업을 수행할 수 있습니다 .awk