2011-07-07 25 views
8

Nếu tôi làm ps ax trong Terminal, kết quả sẽ là như thế này:Echo ps trong khi vẫn giữ dòng mới?

PID TT STAT  TIME COMMAND 
    1 ?? Ss  2:23.26 /sbin/launchd 
    10 ?? Ss  0:08.34 /usr/libexec/kextd 
    11 ?? Ss  0:48.72 /usr/sbin/DirectoryService 
    12 ?? Ss  0:26.93 /usr/sbin/notifyd 

Trong khi nếu tôi làm echo $(ps ax), tôi nhận được:

PID TT STAT TIME COMMAND 1 ?? Ss 2:23.42 /sbin/launchd 10 ?? Ss 0:08.34 /usr/libexec/kextd 11 ?? Ss 0:48.72 /usr/sbin/DirectoryService 12 ?? Ss 0:26.93 /usr/sbin/notifyd 

Tại sao?

Và làm cách nào để bảo toàn các dòng mới và ký tự tab?

Trả lời

25

Cùng một cách như mọi khi: dấu ngoặc kép sử dụng.

echo "$(ps ax)" 
2

Đó là bởi vì echo không phải là đường ống - nó giải thích đầu ra của ps ax dưới dạng biến và (không được kiểm) biến trong bash về cơ bản nén khoảng trắng - bao gồm cả dòng mới.

Nếu bạn muốn ống đầu ra của ps, sau đó ống nó:

ps ax | ... (some other program) 
+0

Ok, nói tôi muốn làm 'ps axe | grep foobar' nó vẫn làm hỏng thiết kế. – Tyilo

+0

Tôi sử dụng cấu trúc đó mọi lúc và nó hoạt động tốt cho tôi. Nếu bạn nghĩ rằng đầu ra không chính xác khi thực sự đường ống, vui lòng cung cấp chi tiết bổ sung trong câu hỏi của bạn. – Flimzy

+1

Không, chỉ là tôi hoàn toàn ngu ngốc – Tyilo

0

Hoặc nếu bạn muốn có line-by-line truy cập:

readarray psoutput < <(ps ax) 

# e.g. 
for line in "${psoutput[@]}"; do echo -n "$line"; done 

Điều này đòi hỏi một phiên bản gần đây (ish) bash

5

Đơn giản chỉ cần sử dụng hai dấu ngoặc kép trong biến đó là được echo'd

echo "$(ps ax)" 

điều này sẽ làm điều đó mà không cần thêm bất kỳ mã hóa hoặc rắc rối nào khác.

chỉnh sửa: ugh ... ai đó đã đánh tôi với nó! lol

+0

Đặc biệt cho bạn quá thân thiết. –

-1

Bạn đang nói về đường ống đầu ra? Câu hỏi của bạn cho biết "đường ống", nhưng ví dụ của bạn là lệnh thay thế:

ps ax | cat #Yes, it's useless, but all cats are... 

Hữu ích hơn?

ps ax | while read ps_line 
do 
    echo "The line is '$ps_line'" 
done 

Nếu bạn đang nói về command substitution, bạn cần dấu ngoặc kép như những người khác đã chỉ ra trong trật tự để buộc các vỏ không vứt bỏ khoảng trắng:

echo "$(ps ax)" 
foo="$(ps ax)" 
0

suy nghĩ lại vấn đề của bạn/giải pháp.

Khi bạn muốn $ (ps rìu) - với dòng mới được lưu giữ - USUALLY có nghĩa là thiết kế tồi và bạn có thể muốn sử dụng đường ống hoặc chuyển hướng. Thông thường - vì vậy, có thể nó là ok - thực sự tự hỏi những gì bạn muốn đạt được. :)

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