xargs: 여러 명령에서 동일한 인수를 사용합니다.

xargs: 여러 명령에서 동일한 인수를 사용합니다.

df -h파티션 중 하나의 출력을 조사 하고 파티션 중 하나에 공간이 [또는 거의] 부족할 때 경고를 발생시킬 수 있는 한 줄 코드를 작성하려고 합니다 . 지금 나를 화나게 하는 것은 xargs를 사용하는 부분입니다...

echo 95 | xargs -n1 -I{} [ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"

두 번째 {}에도 "95"가 표시되도록 하려면 어떻게 해야 하나요?

답변1

이는 명령의 일부 &&가 아니며 완전히 별개의 호출입니다. xargs내 생각에는 명시적으로 쉘을 실행하고 싶을 것 같습니다.

echo 95 | xargs -I_percent sh -c '[ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"' sh _percent

또한 쉘의 추가 인용 문제를 피하기 위해 _percent대신 사용하고 있음을 참고하십시오 . {}이는 쉘 변수가 아닙니다. 여전히 xargs대체 문자열일 뿐입니다.

답변2

또 다른 읽기 쉬운 접근 방식은 다른 모든 명령을 포함하는 별도의 함수를 정의한 다음 xargs하위 쉘에서 해당 함수를 호출하는 것입니다.

예를 들면 다음과 같습니다.

myfunc(){
  [ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"
  echo "Another command echoing $1"
}

export -f myfunc

echo 95 | xargs -n1 -I_percent -- sh -c 'myfunc "_percent"'

답변3

그냥 사용할 수 있습니다sh옵션을 언급하고 아래와 같이 명령을 작은따옴표로 묶습니다.if버전:

#Your example
echo 95 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"'

#if equivalent
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; fi'

xargs그리고 사용별명존재하다-I더 나은 가독성을 위한 옵션

echo 95 | xargs -n1 -IusedSpace sh -c 'if [ usedSpace -ge 95 ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; fi'

그리고만약에원하는 만큼의 명령을 세미콜론으로 구분하세요.; 다음과 같은2 및 4 명령 연결의 예

# 2 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Value processed {}"; fi'
# 4 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Space left on disk $( expr 100 - {})%"; echo "Space used {}%"; echo "Value processed {}"; fi'

귀하의 예에 사례를 추가 하면 else왼쪽에 디스크 공간이 인쇄됩니다.

#If with else block
echo 80 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - {})%"; fi'

#Equivalent
echo 80 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"; [ {} -ge 95 ] || echo "Space left on disk $( expr 100 - {})%"'

또 다른 수정을 통해 다음과 같이 변수에서 제한된 사용의 95%를 분리할 수 있습니다.

echo 96 | xargs -n1 -IusedSpace sh -c 'usageLimit=95; if [ usedSpace -ge ${usageLimit} ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - usedSpace)%"; fi'

즐거운 스크립팅! ! ! @엔리케

관련 정보