![xargs: 여러 명령에서 동일한 인수를 사용합니다.](https://linux55.com/image/27321/xargs%3A%20%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%EC%9D%B8%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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'
즐거운 스크립팅! ! ! @엔리케