Làm thế nào tôi có thể lưu lệnh cuối cùng vào một tập tin?


29

Khi tôi đang chạy các phân tích của mình bằng bash shell, tôi thường muốn lưu các lệnh tôi đã sử dụng mang lại cho tôi kết quả tốt cho một tệp trong cùng thư mục ("LOGBOOK" của tôi, như được gọi) để tôi có thể kiểm tra xem Tôi đã làm để có được những kết quả đó. Cho đến nay, điều này có nghĩa là tôi sao chép. Lấy lệnh từ thiết bị đầu cuối hoặc nhấn "lên" sửa đổi lệnh thành một echo"my command" >> LOGBOOKhoặc các trò hề tương tự khác.

Tôi đã tìm thấy có một historycông cụ vào ngày khác, nhưng tôi không thể tìm ra cách sử dụng nó để nhận lệnh được thực thi trước đó để tôi có thể làm một cái gì đó như thế nào getlast >> LOGBOOK.

Có một cách dễ dàng tốt đẹp để làm điều này. Ngoài ra, làm thế nào để người khác đối phó với việc lưu các lệnh cho kết quả họ có?

Câu trả lời:


37

Nếu bạn đang sử dụng bash, bạn có thể sử dụng fclệnh để hiển thị lịch sử của mình theo cách bạn muốn:

fc -ln -1

Điều đó sẽ in ra lệnh cuối cùng của bạn. -lcó nghĩa là danh sách, -ncó nghĩa là không để tiền tố dòng với số lệnh và -1nói chỉ hiển thị lệnh cuối cùng. Nếu khoảng trắng ở đầu dòng (chỉ dòng đầu tiên trên các lệnh đa dòng) gây khó chịu, bạn có thể thoát khỏi điều đó đủ dễ dàng với sed. Biến nó thành hàm shell và bạn có một giải pháp theo yêu cầu ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

Điều đó sẽ hoạt động như bạn đã hỏi trong câu hỏi của bạn.

Tôi đã thêm một biến thể nhỏ bằng cách thêm "$1" "$1"vào fclệnh. Điều này sẽ cho phép bạn nói, ví dụ, getlast mycommandđể in ra dòng lệnh cuối cùng mycommand, vì vậy nếu bạn quên lưu trước khi chạy lệnh khác, bạn vẫn có thể dễ dàng lưu phiên bản cuối cùng của lệnh. Nếu bạn không truyền đối số cho getlast(tức là gọi fcdưới dạng fc -ln "" "", nó chỉ in ra lệnh cuối cùng).

[Lưu ý: Trả lời được chỉnh sửa để giải thích cho nhận xét của @ Bram và vấn đề được đề cập trong câu trả lời của @glenn jackman.]


5
Các hình thức đầu tiên fc -lnr | head -n 1có thể được viết tắt fc -lnr -1.
Bram

@Bram: Thứ tốt. Tôi đã sử dụng help fccho tài liệu của tôi. Trang bash man có nhiều chi tiết hơn, bao gồm cả việc sử dụng các chỉ số tiêu cực. Loại bỏ headlà tốt vì một lệnh còn lại được tích hợp sẵn nên hiện tại không có fork / exec.
camh

1
Tôi tự hỏi tại sao lệnh được gọi là fc...
imz - Ivan Zakharyaschev

2
Nó là viết tắt của "lệnh sửa chữa". gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel

9

Một vấn đề với câu trả lời của @ camh là nếu bạn có một lệnh kéo dài nhiều dòng, nó chỉ hiển thị dòng đầu tiên:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Thử đi:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

3
enable cmdhistsẽ khắc phục điều đó: "Nếu được đặt, bash sẽ cố lưu tất cả các dòng của lệnh nhiều dòng trong cùng một mục lịch sử. Điều này cho phép dễ dàng chỉnh sửa lại các lệnh đa dòng."
Đánh dấu McKinstry

2

Thay vì sử dụng mũi tên lên, bạn có thể sử dụng "!!"để tham khảo lệnh trước đó.

ví dụ

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

lưu ý: điều này không trích dẫn văn bản chữ


5
Điều đó sẽ không nắm bắt được lệnh theo nghĩa đen. Nếu có bất kỳ siêu ký tự shell nào, chúng sẽ được đánh giá và thay thế. Đường ống cũng sẽ bị vỡ: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh

0

Bạn có thể làm điều đó với lệnh sau nếu bạn đang sử dụng bash shell:

$> history -a LOGBOOK

Điều này sẽ nối tất cả các lệnh của bạn từ phiên hiện tại vào tệp đó, bạn cũng có thể thêm bí danh trên tệp ~ / .bashrc để thực hiện việc này bằng một lệnh duy nhất:

$> alias getlast="history -a LOGBOOK"

1
Nhưng bạn đang thiếu yêu cầu quan trọng hơn là tôi chỉ lưu các lệnh đã hoạt động và nhận được kết quả mà tôi có. Tôi không muốn lưu tất cả các lệnh gần đây tôi đã thực hiện, chỉ chọn những lệnh sau khi tôi đã sử dụng chúng. Dù sao cũng cảm ơn bạn.
MattLBeck
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.