[bash] bash에서 N 번 명령을 실행하는 더 좋은 방법이 있습니까?

때때로 다음과 같이 bash 명령 줄을 실행합니다.

n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done

some_command이 경우 10 회 연속으로 여러 번 실행 합니다.

종종 some_command실제로는 일련의 명령 또는 파이프 라인입니다.

더 간결한 방법이 있습니까?



답변

for run in {1..10}
do
  command
done

또는 쉽게 복사하여 붙여 넣기를 원하는 사람들을위한 하나의 라이너 :

for run in {1..10}; do command; done


답변

상수 사용하기 :

for ((n=0;n<10;n++)); do some_command; done

변수 사용 (수학 표현식 포함) :

x=10; for ((n=0; n < (x / 2); n++)); do some_command; done


답변

해킹하는 또 다른 간단한 방법 :

seq 20 | xargs -Iz echo "Hi there"

에코를 20 번 실행하십시오.


다음과 같이 seq 20 | xargs -Iz echo "Hi there z"출력됩니다.

안녕하세요 1
안녕하세요 2


답변

zsh 쉘을 사용중인 경우 :

repeat 10 { echo 'Hello' }

여기서 10은 명령이 반복되는 횟수입니다.


답변

GNU Parallel을 사용하면 다음을 수행 할 수 있습니다.

parallel some_command ::: {1..1000}

숫자를 인수로 원하지 않고 한 번에 하나의 작업 만 실행하려는 경우 :

parallel -j1 -N0 some_command ::: {1..1000}

빠른 소개를 위해 소개 동영상을 시청하십시오.
https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

학습서 ( http://www.gnu.org/software/parallel/parallel_tutorial.html )를 진행하십시오. 당신은 그것을 사랑하는 명령 줄입니다.


답변

bash 구성 파일의 간단한 기능은 ~/.bashrc종종 잘 작동 할 수 있습니다.

function runx() {
  for ((n=0;n<$1;n++))
    do ${*:2}
  done
}

이렇게 불러

$ runx 3 echo 'Hello world'
Hello world
Hello world
Hello world


답변

xargs이다 빠른 :

#!/usr/bin/bash
echo "while loop:"
n=0; time while (( n++ < 10000 )); do /usr/bin/true ; done

echo -e "\nfor loop:"
time for ((n=0;n<10000;n++)); do /usr/bin/true ; done

echo -e "\nseq,xargs:"
time seq 10000 | xargs -I{} -P1 -n1 /usr/bin/true

echo -e "\nyes,xargs:"
time yes x | head -n10000 |  xargs -I{} -P1 -n1 /usr/bin/true

echo -e "\nparallel:"
time parallel --will-cite -j1 -N0 /usr/bin/true ::: {1..10000}

최신 64 비트 Linux에서 다음을 제공합니다.

while loop:

real    0m2.282s
user    0m0.177s
sys     0m0.413s

for loop:

real    0m2.559s
user    0m0.393s
sys     0m0.500s

seq,xargs:

real    0m1.728s
user    0m0.013s
sys     0m0.217s

yes,xargs:

real    0m1.723s
user    0m0.013s
sys     0m0.223s

parallel:

real    0m26.271s
user    0m4.943s
sys     0m3.533s

이것은 xargs명령이 Bash에서 모두 해석되는 and 루프 /usr/bin/true대신 명령을 여러 번 생성하는 단일 기본 프로세스이므로 의미가 있습니다. 물론 이것은 하나의 명령에서만 작동합니다. 각 반복에서 여러 명령을 수행 해야하는 경우 루프는 xargs에 전달 하는 것보다 빠르거나 빠릅니다.forwhilesh -c 'command1; command2; ...'

-P1또한 말에 변경 될 수 있습니다 -P8속도에서 또 다른 큰 후원을 얻기 위해 병렬로 8 개 프로세스를 생성 할 수 있습니다.

GNU 병렬이 왜 그렇게 느린 지 모르겠습니다. 나는 그것이 xargs와 비교 될 것이라고 생각했을 것입니다.