Bash에서 awk와 echo를 사용하는 방법

Bash에서 awk와 echo를 사용하는 방법

bash 스크립트에서 실행하면(예:이것) 콘텐츠를 파일로 보내려면:

sudo ./bar.sh > foo

내용 bar.sh:

echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'

foo 출력:

for pid in $(ps -ef | grep "smbd" | awk {print }); do kill -9 $pid &> /dev/null; done

$2밖에서 길을 잃었습니다.

예상 출력:

for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done

어떻게 얻을 수 있나요?

답변1

첫 번째,sudo꼭 필요한 경우가 아니면 절대 실행하지 마세요.sudo. 나는 이것을 충분히 강조할 수 없다. "Permission Denied" 오류가 발생하지 않는 한 이를 사용할 필요도 없고 sudo사용해서는 안 됩니다 . 따라서 실행할 sudo필요가 없습니다 .sudo ./bar.sh./bar.sh

echo다음으로는 명령 결과를 얻을 필요가 없습니다 . 이는 필요하지 않습니다.

echo '$(ps -ef | grep "smbd" | awk '{print $2}')'

필요한 것은 명령 자체를 실행하는 것뿐입니다. 명령 대체( $(command)) 또는 에코가 필요하지 않습니다 . 스크립트에 다음을 추가하면 됩니다.

ps -ef | grep "smbd" | awk '{print $2}'

실행 중인 프로세스의 PID를 얻으려는 경우 실제로는 둘 중 하나도 필요하지 않습니다 ps. 결과에 나타나는 프로세스 자체의 문제를 피하기 위해 이를 사용할 수 있습니다 pgrep smbd.grep

마지막으로 여러 줄 문자열을 출력으로 인쇄하려면 다음을 사용할 수 있습니다.여기에 문서가 있습니다많은 echo 문 대신. 따라서 이 모든 것을 종합하면 다음과 같아야 합니다 bar.sh.

#!/bin/sh

cat <<'EoF'
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do 
    kill -9 "$pid" &> /dev/null
done
EoF

그런 다음 실행하십시오 ./bar.sh > foo(아니요 sudo!).

또는 동일한 접근 방식의 더 간단한 버전은 다음과 같습니다.

#!/bin/sh

cat <<'EoF'
ps -ef | awk '/smbd/{print $2}' | while read pid; do 
    kill -9 "$pid" &> /dev/null
done
EoF

또는 더 간단하게:

#!/bin/sh

printf '%s\n' 'kill -9 $(pgrep smbd)'

마지막 요점은 다음과 같습니다. 당신은 그렇습니까?틀림없이정말로 대본을 원하시나요? 실행 중인 모든 프로세스를 종료하려면 smbd다음 명령 하나만 필요합니다.

pkill -9 smbd

관련 정보