이게 내 코드야
#!/bin/bash
showword() {
echo $1
}
echo This is a sample message | xargs -d' ' -t -n1 -P2 showword
showword
그래서 함수에 인수로 전달하는 문자열을 에코하는 함수가 있습니다 .
그런 다음 xargs
함수를 호출하고 한 번에 한 단어씩 전달하고 함수의 복사본 2개를 병렬로 실행해 보았습니다. 작동하지 않는 것은 xargs
기능이 인식되지 않는다는 것입니다. 내가 원하는 것을 어떻게 달성할 수 있습니까? xargs가 이 기능과 함께 작동하도록 하려면 어떻게 해야 합니까 showword
?
답변1
함수를 내보내고 서브셸에서 호출해 보세요.
showword() {
echo $1
}
export -f showword
echo This is a sample message | xargs -d' ' -t -n1 -P2 bash -c 'showword "$@"' _
이로 인해 xargs
실행이 발생합니다.
bash -c 'showword "$@"' _ This
bash -c 'showword "$@"' _ is
bash -c 'showword "$@"' _ a
︙
명령에 전달된 인수는 bash
bash 환경으로 전달되지만 0부터 시작됩니다. 따라서 함수 내부에서는
$0
"_
"이고$1
"This
" 입니다.$0
"_
"이고$1
"is
" 입니다.$0
"_
"이고$1
"a
" 입니다.- ︙
바라보다위치 인수가 있는 Bash -c.
이는 export -f
Bash에서만 작동하며 ( )는 GNU에서만 작동합니다.-Pn
--max-procs=max-procs
xargs
답변2
대체 솔루션을 추가하면 parallel
대신 작업이 더 쉬워집니다 xargs
.parallel
#!/bin/bash
showword() {
echo $1
}
export -f showword
parallel -j2 showword {} ::: This is a sample message
-j2
함수의 복사본 2개가 병렬로 실행되는지 확인하세요.:::
parallel
이 이후의 내용은 공백으로 구분된 별도의 인수로 전달됩니다.{}
parallel
showword
함수에 전달된 매개변수로 대체됨
zsh에는 기능을 내보내는 기능이 없기 때문에 zsh 셸을 사용하는 경우 이 솔루션이 작동하지 않습니다. 다음과 같은 것이 필요합니다.
#!/usr/bin/zsh
showword() {
echo $1
}
# add the following to your .zshrc if you want env_parallel in your shell permanently
source /usr/bin/env_parallel.zsh
env_parallel -j2 --env showword showword {} ::: This is a sample message
답변3
매개변수를 받아서 무엇이든 수행하는 함수를 만들어 보겠습니다(내 함수는 이를 두 번 인쇄합니다).
$ twice() { echo $1$1 }
$ twice "hello"
hellohello
입력을 읽지 않기 때문에 파이프에서는 작동하지 않습니다.
$ echo "hello" | twice
<nothing>
임시 변수의 입력을 읽는 것만으로도 이 문제를 해결할 수 있습니다.
$ echo "hello" | read s; twice $s
hellohello
아니면 접근성을 사용하세요
$ call() { read s; $1 $s }
$ echo "hello" | call twice
hellohello