2012-06-22 43 views
6

bắt đầu bash với -v tùy chọn tạo ra một đầu ra dài ra cửa sổ ConsoleĐầu ra có thể bash -v được chuyển hướng không?

$ bash -v 

source ~/Dropbox/bin/tim_functions.sh 

\#!/bin/bash 
...several hundred more lines 

Tôi muốn bắt đầu ra vào một tập tin để làm cho nó dễ dàng hơn để duyệt qua, nhưng tôi đã cố gắng bash -v 2>&1 > out_bash.txtbash -v | tee out_bash.txt và không thể nắm bắt được thông tin trên màn hình đầu cuối trong một tệp. Nó là như thể đầu ra tiết là không stderr hoặc stdout. Làm sao có thể?

Có ai có thể đề xuất cách để nắm bắt đầu ra của bash -v không?

Trả lời

1

Sau khi đọc câu trả lời hữu ích khác, tôi tin rằng vấn đề này đã làm với bao bash đang gửi thông tin tiết để tty - đó là bằng cách nào đó khác với stderr hoặc stdout. Nó có thể bị bắt với công việc sau đây xung quanh:

$ screen -L 
$ bash -v 
$ exit #from the bash session 
$ exit #from the screen session 

Kết quả này tạo ra tệp screenlog.0 chứa đầu ra.

Các bash -v đầu ra quan tâm là trên mac chạy 10.7.3 (Lion) với

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc.) 

Một 10.6.8 mac tôi đã cố gắng có một ít (tiết/thú) đầu ra, mặc dù tương tự .bashrc.

0

Bạn đã thử gói bash con của bạn trong một vỏ bọc?

(bash -v) 2>&1 > out_bash.txt 
+0

Tôi cố gắng gợi ý của bạn, nhưng không có may mắn - vẫn không nắm bắt được thông tin. Dường như đầu ra của bash -v có liên quan đến thông tin gỡ lỗi. Và thông tin gỡ lỗi dường như không phải là stderr hoặc stdout. Tôi bắt đầu nghĩ rằng nó không thể được định tuyến lại từ nhà ga. – Tim

+0

Bash không phải là phép thuật; bất cứ thứ gì được gửi tới tty của bạn đều xuất phát từ lời gọi 'write()' (hoặc tương đương) từ * ở đâu đó *. Điều có thể xảy ra là bản thân vỏ tương tác đang tạo ra đầu ra, trong khi chuyển hướng chỉ có thể áp dụng cho các tiến trình con sinh ra. Đây là lý do tại sao tôi nghĩ rằng gói một lớp và cẩu các chuyển hướng lên có thể làm việc .. – phs

+0

Nhưng khi bạn đang ở trong một phiên bash và thực hiện bash -v, mà không tạo ra một quá trình con (phiên bash mới). Vì vậy, trừ khi quá trình cha mẹ đã làm cho các cuộc gọi write() cho các thông tin gỡ lỗi của đứa trẻ, chứ không phải là quá trình con gọi write() chính nó, nó vẫn có vẻ như các thông tin thiết bị đầu cuối nên được tái trực tiếp. Nhưng có lẽ đó là cách thông tin gỡ lỗi được tạo ra - cha mẹ bằng cách nào đó giám sát hoạt động của đứa trẻ và báo cáo về nó. – Tim

4

Tôi chọc xung quanh và thấy điều này http://www.commandlinefu.com/commands/view/3310/run-a-bash-script-in-debug-mode-show-output-and-save-it-on-a-file

Trên trang web mà họ sử dụng bash -x test.sh 2>&1 | tee out.test, nhưng tôi thử nghiệm nó với bash -v test.sh 2>&1 | tee out.test và nó làm việc tốt.

+0

Tôi đang làm một cái gì đó một chút khác nhau mặc dù - Tôi đang cố gắng để chạy chỉ 'bash -v' không 'bash -v some_script.sh'. Chạy bash -v cung cấp thông tin gỡ rối từ việc tạo một tiến trình con shell mới thay vì tạo một tiến trình mới đang chạy một kịch bản lệnh. Dường như thông tin gỡ lỗi rất khó nắm bắt trong trường hợp của tôi. Nhưng tôi đã tìm thấy một cách - thông qua sử dụng lệnh màn hình (xem bình luận dưới đây). Cảm ơn bạn đã giúp đỡ. – Tim

+0

@ pgreen2 thx, nó hoạt động – sb32134

6
bash -v 2>&1 > out_bash.txt 

không phải là những gì bạn muốn, nó phải là

bash -v >out_bash.txt 2>&1 
0

Bạn có thể sử dụng, bash -v 2> & 1 | tee file.txt hoặc bash -v 2> & 1 | grep SEARCH_STRING

3

bạn cũng có thể sử dụng lệnh exec trong kịch bản để chuyển hướng tất cả các đầu ra:

#!/bin/bash 
exec >> out.txt 2>> out.txt 
set -x 
set -v 
echo "testing debug of shell scripts" 
ls 
Các vấn đề liên quan