sourcecode

xargs를 사용한 호출 셸 함수

copyscript 2023. 4. 9. 22:16
반응형

xargs를 사용한 호출 셸 함수

더 복잡한 함수를 병렬로 호출하기 위해 xargs를 사용하려고 합니다.

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} 
exit 0

그러면 오류가 반환됩니다.

xargs: echo_var: No such file or directory

이를 위해 xargs를 사용할 수 있는 방법이나 다른 솔루션에 대한 아이디어가 있으면 좋겠습니다.

기능을 내보내면 다음과 같이 됩니다(테스트되지 않음).

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

빌트인을 사용할 수 있습니다.printf외부 대신seq:

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

또, 사용법return 0그리고.exit 0예를 들어 앞의 명령에 의해 생성될 수 있는 모든 오류 값을 마스킹합니다.또, 에러가 없는 경우는, 디폴트이기 때문에 다소 장황합니다.

@phoric은 Bash 명령어를 다음과 같이 단순화할 수 있다고 언급하고 있습니다.

bash -c 'echo_var "{}"'

이동{}바로 그 안에.그러나 @Sasha가 지적한 바와 같이 명령어 주입에는 취약합니다.

다음으로 임베디드 형식을 사용하지 않는 예를 제시하겠습니다.

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019

그렇지 않은 또 다른 예를 다음에 제시하겠습니다.

echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'

세이프 포맷을 사용하여 다음과 같이 출력됩니다.

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)

이는 매개 변수화된 SQL 쿼리를 사용하여 주입을 방지하는 것과 유사합니다.

사용하고 있다date여기서 명령어 대체 또는 이스케이프 따옴표를 사용하여rm사샤의 코멘트에 사용된 명령어는 비파괴적이기 때문입니다.

GNU Parallel을 사용하는 방법은 다음과 같습니다.

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
export -f echo_var
seq -f "n%04g" 1 100 | parallel -P 10 echo_var {} 
exit 0

버전 20170822를 사용하면export -f다음을 실행하고 있는 경우:

. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {} 

다음과 같은 기능도 사용할 수 있습니다.

function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "

코멘트를 할 수 없는 것 같습니다.- (

저는 이 모든 것에 초점을 맞추고 싶습니다.

bash -c 'echo_var "$@"' _ {}
vs
bash -c 'echo_var "{}"'

첫 번째는 {}을(를) bash할 arg로 대체하고 두 번째는 함수의 arg로 대체합니다.예제 1이 $(날짜)를 확장하지 않는 것은 단순히 부작용입니다.

함수 args를 확장하지 않을 경우 이중 따옴표가 아닌 단일 따옴표를 사용합니다.지저분한 중첩을 방지하려면 큰따옴표를 사용합니다(다른 쪽 arg 확장).

$ echo '$(date)' | xargs -0 -L1 -I {} bash -c 'printit "{}"'
Fri 11 Sep 17:02:24 BST 2020

$ echo '$(date)' | xargs -0 -L1 -I {} bash -c "printit '{}'"
$(date)

이는 잘못된 방법일 수 있지만, 만약 당신이 함수를 정의한다면.bashrc또는 다른 스크립트에서는 파일 또는 적어도 함수 정의를 다음과 같은 설정으로 랩할 수 있습니다.allexport:

set -o allexport

function funcy_town {
  echo 'this is a function'
}
function func_rock {
  echo 'this is a function, but different'
}
function cyber_func {
  echo 'this function does important things'
}
function the_man_from_funcle {
  echo 'not gonna lie'
}
function funcle_wiggly {
  echo 'at this point I\'m doing it for the funny names'
}
function extreme_function {
  echo 'goodbye'
}

set +o allexport

언급URL : https://stackoverflow.com/questions/11003418/calling-shell-functions-with-xargs

반응형