2010-07-20 43 views
33

Không cho đến giữa chừng thông qua 3 giờ xây dựng kịch bản, tôi sẽ nhớ rằng tôi muốn xem một cái gì đó ở đầu của đầu ra sau khi nó được thực hiện. Tại thời điểm này tôi đã vượt quá số dòng trong terminal của tôi vì vậy tôi không thể cuộn lên để xem nó (hoặc đầu là khó tìm). Tất nhiên tôi có thể tốt hơn về lưu trữ đầu ra của tôi, nhưng tôi đã luôn luôn tò mò nếu điều này là có thể.Đầu ra của lệnh shell cuối cùng

Trong vỏ linux, có thể trả về đầu ra của lệnh cuối cùng không. Tôi nhận ra tôi có thể có đường ống nó hoặc gửi đầu ra cho một tập tin, nhưng yêu cầu của tôi là lấy lại đầu ra đó sau khi lệnh đã được chạy.

Sử dụng csh, nhưng sẽ nghe về bất kỳ trình bao nào.

+0

bash http://stackoverflow.com/questions/5955577/bash-automatically-capture-output-of-last-executed-command-into-a-variable –

Trả lời

32

No. Đầu ra của chương trình không bao giờ đi qua tay của vỏ. Nếu không có chuyển hướng, nó sẽ chuyển thẳng đến TTY. Với chuyển hướng, nó đi thẳng đến bất kỳ tập tin hoặc đường ống nó đã được hướng đến. Shell không biết quá trình gửi tới stdout/stderr là gì.

+0

Cảm ơn, đó là điều tôi muốn biết – ack

1

Bạn có thể thấy mã trả về của lệnh cuối cùng, ít nhất là bằng bash, với $?.

Như xa stdout đi, tôi không nghĩ rằng bạn có thể.

0

lưu đầu ra dưới dạng biến?

bash: Output=$(ls); echo $Output 
+0

Anh ấy nói trong câu hỏi của ông: "Tôi nhận ra rằng tôi có thể có đường ống hoặc gửi đầu ra tới một tập tin, nhưng yêu cầu của tôi là lấy lại đầu ra đó sau khi lệnh đã được chạy." –

2

Cách sử dụng thay thế. Như thế này:

command1 
command2 
RESULT=`LASTCOMMAND` 
echo $RESULT

+0

backticks là phần phức tạp hơn. mọi người có xu hướng sử dụng dấu nháy đơn hoặc kép. – asgs

0

Tôi có thể sử dụng lệnh tee để đưa đầu ra vào STDOUT cũng như vào một tệp và sau đó sử dụng nó.

3

Điều này có thể rất lộn xộn với các lệnh nhất định sử dụng trỏ địa chỉ. Đầu ra của phiên vim của bạn là gì? Hoặc một ví dụ sane hơn một chút: Bạn đang tải xuống một tệp với wget và nó cho thấy một thanh tỷ lệ phần trăm đi từ 0% đến 100%. Đầu ra là gì?

Tôi nghĩ rằng bạn về cơ bản muốn có bản cứng của bất kỳ thứ gì giữa dòng hiện tại của bạn và lời nhắc trước đó. Đó không phải là một cái gì đó chuyển hướng vỏ sẽ là một ví dụ tốt cho, đó là cơ bản một cái gì đó một thiết bị đầu cuối sẽ làm. Bạn có thể làm điều đó bằng tay bằng cách sao chép và dán trong màn hình, và có thể bạn có thể tự động hóa nó với lệnh exec của nó. tmux có thể có một cái gì đó tương tự, và bạn có thể làm những điều kỳ lạ với chế độ vỏ (s) của Emacs, nhưng đó là một giải pháp khá nặng. rxvt-unicode có perl extension ...

19

script(1) là chính xác những gì bạn cần:

script 
make 
exit 
vim typescript 

Chương trình script sẽ bắt đầu một vỏ mới và tiết kiệm đầu vào và đầu ra đến tập tin typescript. Khi bạn hoàn tất, chỉ cần đóng vỏ bằng exit hoặc ^D. Nếu bạn không muốn bắt đầu một trình bao mới nhưng chỉ chạy bản dựng của bạn, bạn có thể sử dụng: script -c <command>.

+0

Thật tuyệt. Tôi thích cách bạn có thể sử dụng nó để đăng nhập một loạt các lệnh. – ack

0

Đây là chức năng của thiết bị đầu cuối của bạn. Bạn nên tập trung vào việc tạo một thiết lập mà bạn không phải nhớ làm bất cứ điều gì. Một giải pháp có thể là để khởi chạy "màn hình" trong kịch bản đăng nhập của bạn (không dễ dàng như vậy để có được quyền) với tính năng ghi nhật ký được bật.

8

Nếu chạy lại lệnh sẽ không thay đổi bất cứ điều gì, bạn có thể sử dụng !! để truy cập vào đầu ngăn xếp lịch sử để chạy lại lệnh cuối cùng. Làm như vậy trong backticks sẽ cho phép bạn sử dụng kết quả.

$> find . -iname fileInUnknownLocationInHierarchy.txt 
./something/buried/deep/where/you/dont/want/to/retype/fileInUnknownLocationInHierarchy.txt 
$> vim `!!` 
+0

Điều này hoạt động nhưng nó có nghĩa là chạy lại lệnh. Nếu lệnh trước đó là tìm kiếm dài, bạn sẽ phải đợi lại. – Melebius

0

Bạn luôn có thể chạy quy trình bên trong cửa sổ trình bao emacs. Nó sẽ giữ mọi thứ.

1

Nếu bạn đang tìm kiếm hoàn toàn cho mã trả về của lệnh được thực thi cuối cùng, hãy sử dụng echo $?.

Điều này thường hữu ích khi bạn muốn tìm xem liệu lệnh cuối cùng của bạn có được thực hiện thành công hay không và bạn cũng có thể tạo điều này cho kịch bản xây dựng của mình để nhận thông báo lỗi/không thành công.

Các vấn đề liên quan