Lịch sử của người Viking ngừng hoạt động khi chạy bên trong tập lệnh bash


9

Tôi đang viết một kịch bản đơn giản để grep lịch sử bash của tôi để tìm một chuỗi cụ thể. Trên dòng lệnh, tôi có thể làm như sau, hoạt động tốt:

history | grep git

Tuy nhiên, khi tôi tạo một tập lệnh bash với lệnh tương tự như trên, đột nhiên historykhông trả về gì:

#!/bin/bash
history | grep git

Khi tôi xóa dòng đầu tiên #!/bin/bash, tập lệnh của tôi hoạt động trở lại. Có chuyện gì đang xảy ra ở đây? Làm thế nào tôi có thể sử dụng historybên trong một tập lệnh bash?

Câu trả lời:


8

Sau đây là cho bash 4.0 or higher only, nhưng nó thực hiện các mẹo. :)

#!/bin/bash -i
history | grep sometext

Làm! Hãy thử nó. ( -i= i nteractive, một cờ không có sẵn để bash 3.x trở về trước)


Cũng cảm ơn anh chàng gần đây đã hạ bệ tôi chỉ vì anh ta có thể. (Có lẽ là bashngười dùng v3, vì thất vọng đơn thuần, haha). Ít nhất là đối với Martin, giải pháp của tôi rất hữu ích, đó là (ít nhất) một sự thoải mái.
cú pháp

Tôi đã có cùng một câu hỏi khi tôi đang viết một công cụ ghi nhật ký làm việc sau giờ làm việc cho các kỹ sư hỗ trợ 24/7 .. cảm ơn!
Henry van Megen

14

Khi bạn chạy tập lệnh bash shell, ví dụ bằng cách chạy tệp thực thi có dòng shebang #!/bin/bash, tập lệnh được chạy trong trình bao không tương tác. Một trong những tính năng của vỏ không tương tác là lịch sử bị vô hiệu hóa. Vì vậy, nếu bạn muốn tập lệnh của mình có thể sử dụng lịch sử, bạn cần phải làm một cái gì đó như thế này:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Tất nhiên, trong trường hợp này bạn có thể vừa thực hiện:

grep git ~/.bash_history

Vì cả hai điều trên đều yêu cầu tệp lịch sử ( ~/.bash_history) phải được cập nhật, điều mà gần như chắc chắn sẽ không có.

Tôi không chắc cách bạn chạy tập lệnh của mình sau khi dòng shebang bị xóa. Tìm nguồn tệp (ví dụ: với .) không giống như chạy tập lệnh vì các lệnh chạy trong trình bao hiện tại, có bật lịch sử.


Điều gì về việc thực hiện history -angay sau lệnh set để đảm bảo các lệnh cuối cùng được thêm vào tệp trước?

4
@ illuminÉ: sẽ không giúp. Shell bắt đầu chạy script là một quá trình hoàn toàn khác nhau; nó bắt đầu với một lịch sử trống frsh.
rici
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.