xargs와 함께 정의된 함수를 사용하는 방법

xargs와 함께 정의된 함수를 사용하는 방법

이게 내 코드야

#!/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

명령에 전달된 인수는 bashbash 환경으로 전달되지만 0부터 시작됩니다. 따라서 함수 내부에서는

  • $0" _"이고  $1" This" 입니다.
  • $0" _"이고  $1" is" 입니다.
  • $0" _"이고  $1" a" 입니다.
  •       ︙

바라보다위치 인수가 있는 Bash -c.

이는 export -fBash에서만 작동하며 ( )는 GNU에서만 작동합니다.-Pn--max-procs=max-procsxargs

답변2

대체 솔루션을 추가하면 parallel대신 작업이 더 쉬워집니다 xargs.parallel

#!/bin/bash

showword() {
  echo $1
}
export -f showword

parallel -j2 showword {} ::: This is a sample message
  • -j2함수의 복사본 2개가 병렬로 실행되는지 확인하세요.
  • :::parallel이 이후의 내용은 공백으로 구분된 별도의 인수로 전달됩니다.
  • {}parallelshowword함수에 전달된 매개변수로 대체됨

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

관련 정보