Chạy chương trình X lần


18

Làm thế nào để tôi thực hiện một chương trình X lần trong thiết bị đầu cuối?

Tôi đọc rằng tôi phải thực hiện một bin / bash txt, nhưng tôi không biết cách thực hiện X lần này.


Nó là gì, một kịch bản, một ứng dụng, nó làm gì? Điều gì sẽ xảy ra trong trường hợp lỗi? Nó đóng sau khi nó chạy? Có nên kiểm tra nếu nó đã đóng cửa?
Jacob Vlijm

Nó chỉ là một cú nhấp chuột, nhấp vào xdotool Tôi không nghĩ rằng nó có thể tạo ra một lỗi.
dùng3597989

@KasiyA: Không chính xác vì tất cả những câu trả lời đó cứ lặp đi lặp lại. Ở đây OP yêu cầu một số vòng cố định.
Sylvain Pineau

4
Hoặc của Blufter: askubfox.com/a/508752/158442 - nhưng cả hai đều không thuộc về nơi này, nhưng ở đây. : D
muru

2
@KasiyA: Câu trả lời của câu hỏi có nên ở đây không trong Lặp lại một lệnh mỗi x khoảng thời gian trong thiết bị đầu cuối?
Sylvain Pineau

Câu trả lời:


24

Bạn có thể sử dụng xargsseq. Nói chung là:

seq nr_of_times_to_repeat | xargs -Iz command

Ví dụ:

seq 10 | xargs -Iz xdotool click 1

sẽ thực thi xdotool click 1lệnh trong 10 lần.


1
Đây có lẽ là giải pháp thanh lịch nhất, chưa kể đơn giản nhất.
Seth

Tôi nghĩ rằng đây là một ví dụ thực sự tốt để giải thích nhân vật tẩu.
PascalVKooten

10

Mở Terminal và sử dụng bashlệnh sau :

for i in {1..5}; do xdotool click 1; done

Với một chút dài dòng và độ trễ 1 giây:

for i in {1..5}; do echo click \#$i && xdotool click 1 && sleep 1; done
click #1
click #2
click #3
click #4
click #5

lỗi
sintax

@ user3597989 Nó hoạt động với tôi, bạn có thể kiểm tra lại không?
Sylvain Pineau

@ user3597989 oh tôi biết, xin vui lòng xóa đầu tiên $. Nó chỉ ở đó để chỉ ra một dấu nhắc vỏ như thế nào sylvain@sylvain-ThinkPad-T430s:~$. Chúng ta thường thêm nó vào câu trả lời dòng lệnh để phân biệt lệnh với kết quả của nó.
Sylvain Pineau

@ user3597989: Tôi đã xóa dấu nhắc shell để tránh nhầm lẫn
Sylvain Pineau

5

Điều này nên làm:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  x=$(( $x + 1 ))
done

Trong đó 10 là số lần chạy lệnh

nếu bạn cần xây dựng trong một chút nghỉ ngơi:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  sleep 1
  x=$(( $x + 1 ))
done

Sao chép tập lệnh vào một tệp trống, thay thế <command to run>bằng xdotoollệnh của bạn , lưu nó dưới dạng run_xdotool.sh, chạy nó bằng lệnh:

sh /path/to/run_xdotool.sh

Ngoài ra, bạn có thể làm cho nó có thể thực thi được và chỉ cần chạy nó bằng cách

/path/to/run_xdotool.sh

Một giải pháp khác: sử dụng tùy chọn lặp lại tích hợp của xdotool

Vì bạn đề cập đến việc sử dụng nó để thực hiện các nhấp chuột, cách dễ nhất có thể là sử dụng xdotooltùy chọn lặp lại tích hợp sẵn của riêng bạn. Định dạng là:

xdotool click --delay <delay> --repeat <repeats> <button>
(delay in milliseconds between the clicks)

Để thực hiện 10 lần nhấp chuột (nút 1) liên tiếp, một giây ở giữa, lệnh là:

xdotool click --delay 1000 --repeat 10 1

5

Nếu bạn có GNU Parallel, bạn có thể chạy:

seq 10 | parallel -N0 doit

Tất cả các máy tính mới đều có nhiều lõi, nhưng hầu hết các chương trình đều có bản chất nối tiếp và do đó sẽ không sử dụng nhiều lõi. Tuy nhiên, nhiều nhiệm vụ cực kỳ song song:

  • Chạy cùng một chương trình trên nhiều tệp
  • Chạy cùng một chương trình cho mỗi dòng trong một tệp
  • Chạy cùng một chương trình cho mọi khối trong một tệp

GNU Parallel là một bộ song song chung và giúp dễ dàng chạy các công việc song song trên cùng một máy hoặc trên nhiều máy bạn có quyền truy cập ssh.

Nếu bạn có 32 công việc khác nhau mà bạn muốn chạy trên 4 CPU, một cách đơn giản để song song là chạy 8 công việc trên mỗi CPU:

Lập kế hoạch đơn giản

GNU Parallel thay vào đó tạo ra một quy trình mới khi kết thúc - giữ cho CPU hoạt động và do đó tiết kiệm thời gian:

Lập kế hoạch song song GNU

Cài đặt

Một cài đặt cá nhân không yêu cầu quyền truy cập root. Nó có thể được thực hiện trong 10 giây bằng cách làm điều này:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Để biết các tùy chọn cài đặt khác, hãy xem http://git.savannah.gnu.org/cgit/abul.git/tree/README

Tìm hiểu thêm

Xem thêm ví dụ: http://www.gnu.org/software/abul/man.html

Xem video giới thiệu: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Xem qua hướng dẫn: http://www.gnu.org/software/abul/abul_tutorial.html

Đăng ký danh sách email để nhận được hỗ trợ: https://lists.gnu.org/mailman/listinfo/abul


1
Tôi thích song song và cố gắng đề xuất cách sử dụng nó bất cứ nơi nào tôi có thể. Một câu hỏi mặc dù tùy chọn cụ thể của bạn: tại sao bạn thích đề xuất hình thức này thay vìparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann

1
{1..10}không hoạt động trong (t) csh / fish / ash, và {1..10}cấu trúc bị giới hạn bởi độ dài của dòng lệnh, vì vậy điều này sẽ không hoạt động: {1..1000000000}trong khi đó seq 1000000000sẽ hoạt động tốt. Nhưng đối với hầu hết các tình huống {1..10}sẽ hoạt động như mong đợi và tôi cũng thường sử dụng điều đó.
Ole Tange

4

Bạn có thể sử dụng forvòng lặp kiểu C có lợi thế so với phiên bản mở rộng dấu ngoặc ( {1..5}) có thể sử dụng các biến để chỉ định điểm kết thúc. Phiên bản tốt hơn là sử dụng tiện ích bên ngoài ( seq).

t=5
for ((x = 1; x <= t; x++))
do
    xdotool click 1
done

Tất cả trên một dòng:

t=5; for ((x = 1; x <= t; x++)); do xdotool click 1; done

Hoặc bạn có thể làm điều đó mà không cần vòng lặp (đối với tiện ích và chức năng cụ thể này):

xdotool click --repeat 5 --delay 50 1

0

Đơn giản là bạn có thể sử dụng lệnh watch:

watch -n x <your command>

thay đổi x thành thời gian tính bằng giây.

Thí dụ :

watch -n 1 xdotool click 1 

Vì vậy, xdotool nhấp 1 sẽ được lặp lại sau mỗi 1 giây, chấm dứt khi bạn hoàn thành.


4
Tôi nghĩ rằng câu hỏi là cụ thể về việc chạy lệnh một số lần xác định , không quá nhiều tại một khoảng thời gian xác định.
Jacob Vlijm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.