Chuyển hướng stdout sang đối số chương trình


2

Tôi chạy một máy chủ Minecraft trên máy tính xách tay Arch Linux của mình. Phần mềm máy chủ cho Minecraft chạy như một chương trình tương tác trên một dòng lệnh, vì vậy tôi khởi động nó trong phiên màn hình tách rời, cho phép tôi gắn lại mỗi khi tôi cần truy cập.

Để làm điều này, tôi đã sử dụng một tập lệnh (Tôi không sử dụng màn hình bất kỳ lúc nào khác, vì vậy đừng lo lắng về "grep SCREEN")

#!/bin/bash

PID=ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'

sudo screen -r $PID

Điều này sẽ nhận được PID của phiên màn hình mà máy chủ đang chạy và sau đó gắn lại vào màn hình đó.

Bây giờ tôi đang tự hỏi, vì tôi không thể tìm thấy điều này ở bất cứ đâu, nếu tôi có thể sử dụng một lớp lót để chuyển hướng đầu ra của

ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'

trực tiếp đến $ argument trong

sudo screen -r $argument

không cần kéo dài 2 dòng

Về cơ bản tôi muốn chuyển hướng stdout của awk thành một đối số của màn hình, thay vì như stdin của màn hình.

Điều này có vẻ như tương đối dễ tìm và làm, nhưng tôi gặp nhiều khó khăn khi tìm kiếm bất cứ điều gì về nó trên Google.

Bất kỳ trợ giúp được đánh giá cao! Cảm ơn bạn


Các câu trả lời cho câu hỏi này nên hoạt động.
Bob

Câu trả lời:


6

Thay vì ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }', bạn chỉ có thể làm

ps aux | awk '/SCREEN/{print $2;exit}'

Hoặc, thậm chí còn được đề xuất hơn, nếu bạn cài đặt procps:

pgrep SCREEN

(Gói các lệnh này trong backticks như được giải thích hoặc sử dụng $()cấu trúc dễ đọc và lồng hơn và thực hiện tương tự.)

Hoặc, thậm chí còn được đề xuất hơn : nếu bạn chỉ có một phiên Màn hình duy nhất đang chạy, chỉ cần:

screen -r

theo mặc định sẽ đính kèm vào phiên duy nhất hiện có.


Như đã lưu ý trong một nhận xét: nếu bạn có thể muốn chạy nhiều phiên Màn hình trong tương lai, hãy sử dụng khả năng đặt tên phiên. Bắt đầu một phiên có tên với

screen -S minecraft

mà sau đó được gắn lại với

screen -r minecraft

1
Tôi gần như đã chết khi đọc điểm cuối cùng của bạn, đây là lý do tại sao tôi nên đọc các trang của đàn ông ... cũng là lý do tại sao tôi cần đọc thêm về các chương trình thao tác văn bản
Joe Bentley

1
Câu trả lời chính xác! Tôi nghĩ việc đặt cho phiên màn hình một cái tên có ý nghĩa sẽ còn tốt hơn nữa, trong trường hợp OP quyết định thực sự bắt đầu sử dụng screentrong tương lai. Tên màn hình được đặt khi màn hình được khởi động lần đầu tiên, sau đó nó có thể được sử dụng để gắn lại như: screen -r <NAME>(không có chevrons).
orryowr

@ ryanrhee90: Rất đúng, tôi thêm nhận xét đó vào bài viết của mình.
Daniel Andersson

1
@JoeBentley: Đây là một câu trả lời tốt cho vấn đề cụ thể của bạn với screen. Tuy nhiên, nếu một người nhìn vào tiêu đề của câu hỏi của bạn, chỉ có hai câu trả lời khác được áp dụng rộng rãi.
DevSolar

@DevSolar: Cả có và không; phần đầu tiên mô tả các cách ngắn hơn để nhận được PID, và backticks và $()được đề cập. Nhưng vâng: đó là một ví dụ về câu hỏi thực sự không thực sự là những gì được hỏi, vì vậy tốt hơn là nên cải tổ câu hỏi (chủ đề có lẽ sẽ đủ) để quan tâm cụ thể đến Màn hình (các câu trả lời khác vẫn nên là trình tự), hoặc xóa các tham chiếu Màn hình và biến nó thành một câu hỏi Bash. Nhưng cách tiếp cận thứ hai thực sự sẽ không phải là những gì người hỏi sau đó, và cuối cùng nó sẽ phần nào là một bản sao của bài đăng được liên kết.
Daniel Andersson

13

xargs sẽ làm điều đó

$echo abc | xargs prog

Ở trên, xargs sẽ thực thi prog với arg abc tức là $prog abc

Một vi dụ khac

$ echo abc | xargs echo w x
w x abc

Cũng là một câu trả lời tốt! Cảm ơn bạn rất nhiều Tôi đã đưa ra gợi ý khác vì nó hơi đơn giản để thực hiện
Joe Bentley

4

Giả sử bạn đang sử dụng bash, một cách khác là sử dụng backticks. AFAIK, backticks được đánh giá đầu tiên và kết quả được sử dụng trong phần còn lại của biểu thức.

sudo screen -r `ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'`

Tôi nghĩ rằng nên làm những gì bạn muốn.

Như một nhà bình luận khác đã chỉ ra, bạn cũng có thể sử dụng xargs, nhưng tôi thích dành cái đó cho công cụ đa đối số. Tôi cảm thấy rằng backticks sạch hơn cho những gì bạn muốn thực hiện.


Rất tốt cảm ơn bạn, mặc dù ps cũng nên ở backticks!
Joe Bentley

1
Bắt tốt, tôi đã sửa câu trả lời. :) Cảm ơn.
orryowr

1
Bạn cũng có thể sử dụng $(prgm), nếu bạn muốn lồng chúng hoặc thứ gì đó (Trời giúp người bảo trì ...)
Christian Mann
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.