[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에 전달 하는 것보다 빠르거나 빠릅니다.for
while
sh -c 'command1; command2; ...'
은 -P1
또한 말에 변경 될 수 있습니다 -P8
속도에서 또 다른 큰 후원을 얻기 위해 병렬로 8 개 프로세스를 생성 할 수 있습니다.
GNU 병렬이 왜 그렇게 느린 지 모르겠습니다. 나는 그것이 xargs와 비교 될 것이라고 생각했을 것입니다.