Làm thế nào để thực thi tất cả các tập lệnh trong một đường dẫn?


13

Giả sử tôi có một tập lệnh nhận một đường dẫn làm tham số. Làm thế nào tôi có thể thực thi tất cả các tập lệnh nằm trong đường dẫn đó?

Câu trả lời:


14

Giả sử theo đường dẫn bạn có nghĩa là đường dẫn đến một thư mục, sử dụng run-parts. Từ man run-parts:

run-parts - run scripts or programs in a directory

Đầu tiên bạn cần thiết lập quyền thực thi trên tất cả các tập lệnh bạn muốn chạy. Thông thường run-partssẽ bỏ qua các thư mục và các tệp không thể thực thi nằm trong thư mục đó.

Mặc dù trước khi chạy, bạn nên kiểm tra tệp nào sẽ được chạy bởi --testtùy chọn:

run-parts --test /path/to/directory

Tôi nên đề cập rằng run-partscó một quy ước đặt tên nghiêm ngặt cho các tập lệnh được thực thi:

If neither the --lsbsysinit option nor the --regex option is given 
then the names must consist entirely of ASCII upper- and
lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens.

Kiểm tra man run-partsđể có thêm ý tưởng.


Đọc một chút, tôi thấy điều này: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run cho tập lệnh trong "$ scripts_to_run_dir" / * do if test -x "$ script"; sau đó "$ script" fi xong Nó làm việc cho tôi, bạn nghĩ sao?
Lautaro Alvarez

@LautaroAlvarez Những gì bạn đang làm với kịch bản đó, có thể dễ dàng thực hiện bằng một lệnh đơn giản run-parts /home/you/Dropbox/scripts_to_run.. hãy cẩn thận về cách đặt tên mặc dù ..
heemayl

bộ phận chạy là mát mẻ. Nhưng nó được tạo cho cron.d và ghi vào syslog dưới dạng cron.notice. Nhưng nó là nguồn ý tưởng tốt, như bỏ qua các tập tin tạm thời và sao lưu ...
mmv-ru

9

Phần chạy sẽ hoạt động nếu tập lệnh của bạn có tên chính xác. Nếu bạn không muốn đối phó với việc đổi tên tập lệnh của mình để phù hợp với run-partssơ đồ đặt tên phức tạp, bạn có thể làm một việc đơn giản như

for file in ~/target/*; do $file 2>/dev/null; done

Điều đó sẽ cố gắng thực hiện tất cả các tệp (và thư mục) được tìm thấy trong ~/target. Các 2>/dev/nullchuyển hướng thông báo lỗi để nó sẽ không khiếu nại khi cố chạy các thư mục hoặc các tệp không thể thực thi.

Ngoài ra, bạn có thể thử tinh vi hơn

for file in ~/target/*; do
    [ -f "$file" ] && [ -x "$file" ] && "$file"
done

Điều này sẽ kiểm tra xem mỗi kết quả là một tệp ( [ -f $file ]), có thể thực thi được không ( [ -x $file ]) và chỉ khi cả hai thử nghiệm đó thành công thì nó mới cố gắng thực hiện tệp.


Cái này hoạt động hoàn hảo cho tôi trong một dự án (một repo rẽ nhánh) tôi đang làm việc - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Rob
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.