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
'sourcecode' 카테고리의 다른 글
WPF의 텍스트 블록에 스트로크 적용 (0) | 2023.04.09 |
---|---|
SQL Server에 Excel 파일을 Import하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
로컬 SQL Server 인스턴스에 대한 관리자 액세스 권한을 자신에게 부여하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
반응 npm start not work : '사용 가능한 chokidar 버전이 없습니다.' (0) | 2023.04.04 |
react-select에서 기본값을 설정하는 방법 (0) | 2023.04.04 |