스크립트의 전체 기능에 문제가 있습니다

스크립트의 전체 기능에 문제가 있습니다

Solaris에서 온라인 네트워크/셸 서비스를 감지하고 싶습니다. 이 목적을 위해 다음 스크립트를 작성했습니다.

compare_ser()
{
if [ "$1" != "" ]; then
echo "True" >> Solaris.txt
fi
}
export -f compare_ser
svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c 'compare_ser $@'

터미널에서 실행 하면 svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 echo다음과 같은 결과가 나타납니다.

online
online

하지만 내 스크립트에는 아무 것도 표시되지 않습니다. 무슨 문제가 있나요?

답변1

나는 더 짧은 방법이 있다고 믿습니다.

svcs network/shell | awk '/online/ {system("bash -c \"compare_ser "$1"\"")}'

이의제기자 여러분, 귀하의 결정을 설명해 주시겠습니까? 리눅스가 무엇인지 이해하시나요? 위의 스크립트는 작동하는 스니펫이며 이를 수행하는 방법은 아마도 수백만 가지가 있을 것입니다. 그래서 설명을 요청합니다.

답변2

이것을 사용하십시오 :

svcs network/shell | cut -d' ' -f1 | grep "online" | xargs -n1 -I{} bash -c 'compare_ser {}'

{}에 의해 생성된 각 값을 보간합니다 xargs. 명령줄 인수를 삽입하려고 시도 했지만 $@인수가 없습니다.

답변3

위치 매개변수를 구문 분석하려면 문자열 주위에 큰따옴표를 사용해야 할 수도 있습니다.

svcs network/shell | cut -d ' ' -f1 | grep "online" | xargs -n1 bash -c "compare_ser $@"

답변4

svcs network/shell | sed -n '/^online /c\
True' >> Solaris.txt

...거의 비슷할 겁니다.

이것이유그러나 쉘 함수는 쉘 코드이고 이에 대해 이미 알고 있는 쉘에 의해 실행되어야 하기 때문에 스크립트에는 아무 것도 표시되지 않습니다. 함수가 작동하려면 함수를 실행하는 쉘에서 먼저 선언해야 합니다.

그러나 을 호출하면 xargs호출하는 프로그램이 다른 프로그램을 호출합니다. 물론 해당 프로그램은 쉘이지만 xargs새 쉘을 호출하는 프로세스는아니요현재 쉘에 정의된 쉘 기능을 이해합니다.

물론, export -f쉘이 이것이 의미하는 바를 이해한다면 이 작업을 수행할 수 있지만, Solaris 시스템을 사용하는 경우에는 ksh그렇지 않습니다. 어쨌든 이것은끔찍한목표가 실제로 달성된다면 목표 달성의 효율성은 매우 낮습니다.

관련 정보