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