Thực hiện chạy khô trong các tập lệnh bash


15

Làm thế nào một người sẽ thực hiện một tùy chọn chạy khô trong một tập lệnh bash?

Tôi có thể nghĩ đến việc gói tất cả các lệnh đơn lẻ trong một if và lặp lại lệnh đó thay vì chạy nó nếu tập lệnh đang chạy với chế độ chạy khô.

Một cách khác là xác định hàm và sau đó chuyển từng lệnh gọi qua hàm đó.

Cái gì đó như:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

`_run mv /tmp/file /tmp/file2`

`DRY_RUN=true _run mv /tmp/file /tmp/file2`

Điều này chỉ sai và có một cách tốt hơn để làm điều đó?


Vì vậy, bạn muốn in những gì lệnh sẽ làm (bao gồm các giá trị của $ VARIABLES) mà không thực sự thực hiện lệnh. Tôi sử dụng một cái gì đó giống như _run()chức năng của bạn , đôi khi với 'set -xv', nhưng tôi sẽ thích một cách tốt hơn.
Stefan Lasiewski

Vâng, chính xác đó. Tôi tự hỏi liệu không có biến nội bộ nào bạn có thể đặt trong bash để các lệnh không thực sự được thực thi, thay vì chuyển chúng qua một hàm
Andrei Serdeliuc

2
Không có lý do gì mà câu hỏi này nên được đánh dấu wiki cộng đồng.
Tạm dừng cho đến khi có thông báo mới.

Bash là một cái vỏ. Không có lý do cho nó để chạy khô. Tôi không nghĩ có một cách làm tốt hơn bạn đã làm.
d -_- b

Câu trả lời:


2

Không phải là một thay thế, nhưng nó trông giống như một tài nguyên tuyệt vời để thử nghiệm và làm việc với các chương trình bash dài hơn.
Andrei Serdeliuc

Tôi đã khôi phục lại bản chỉnh sửa đã thêm một neo vào một phần cụ thể của trang được liên kết kể từ thời điểm trả lời của tôi, như đã nêu, là đọc toàn bộ cuộc thảo luận thay vì chỉ đến một phần hướng dẫn cụ thể. Điểm chung của trang được liên kết nói chung là cố gắng tránh đặt các lệnh được thực thi thành các biến vì có rất nhiều vấn đề.
Tạm dừng cho đến khi có thông báo mới.

Sẽ hữu ích hơn nhiều nếu câu trả lời này tóm tắt những điểm nổi bật của bài viết này. Câu trả lời một dòng vẫn là câu trả lời kém.
Đánh dấu gian hàng

4

Tôi muốn chơi với câu trả lời từ @Dennis Williamson's. Đây là những gì tôi nhận được:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

Điều eval "$@"quan trọng ở đây, và tốt hơn là làm $*. $@trả về tất cả các tham số và $*trả về tất cả các tham số không có khoảng trắng / trích dẫn.

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
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.