Tôi đang cố gắng lặp lại lệnh chạy cuối cùng bên trong một tập lệnh bash. Tôi đã tìm thấy một cách để làm điều đó với một số history,tail,head,sed
hoạt động tốt khi các lệnh đại diện cho một dòng cụ thể trong tập lệnh của tôi từ quan điểm phân tích cú pháp. Tuy nhiên trong một số trường hợp, tôi không nhận được kết quả mong đợi, ví dụ: khi lệnh được chèn vào bên trong một case
câu lệnh:
Kịch bản:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
Đầu ra:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[Q] Ai đó có thể giúp tôi tìm cách lặp lại lệnh chạy cuối cùng bất kể lệnh này được gọi như thế nào / ở đâu trong tập lệnh bash?
Câu trả lời của tôi
Bất chấp những đóng góp được đánh giá cao từ những người bạn của tôi, tôi đã chọn viết một run
hàm - chạy tất cả các tham số của nó dưới dạng một lệnh duy nhất và hiển thị lệnh và mã lỗi của nó khi nó không thành công - với những lợi ích sau:
-Tôi chỉ cần thêm trước các lệnh tôi muốn kiểm tra run
để giữ chúng trên một dòng và không ảnh hưởng đến tính ngắn gọn của tập lệnh của tôi -
Bất cứ khi nào tập lệnh bị lỗi ở một trong các lệnh này, dòng đầu ra cuối cùng của tập lệnh của tôi là một thông báo hiển thị rõ ràng lệnh nào không thành công cùng với mã thoát của nó, giúp gỡ lỗi dễ dàng hơn
Tập lệnh mẫu:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
Đầu ra:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
Tôi đã thử nghiệm các lệnh khác nhau với nhiều đối số, biến bash làm đối số, đối số được trích dẫn ... và run
hàm không phá vỡ chúng. Vấn đề duy nhất tôi tìm thấy cho đến nay là chạy một tiếng vọng bị vỡ nhưng tôi không có kế hoạch kiểm tra tiếng vọng của mình.
run()
không hoạt động đúng khi có dấu ngoặc kép được sử dụng, ví dụ này không thành công:run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
.