Ubuntu: Chạy đầu ra của lệnh khác


13

Tôi có dòng lệnh xuất ra một dòng lệnh khác, ví dụ:

> commandlineA param1 param2
  commandlineB param1

Tôi muốn có một thực thi dòng lệnh duy nhất sẽ chạy dòng lệnhB với (các) tham số đã cho.

Có cách nào đơn giản để làm điều đó bằng cách sử dụng một dòng lệnh đơn hay tôi cần chạy một tệp bash nhỏ sẽ lưu trữ đầu ra trong một biến và sau đó chạy nó?

Cảm ơn


2
Tìm kiếm khá lâu nhưng tôi đoán tôi đã phải tự đặt một câu hỏi để tự mình tìm kiếm .... $ (CommandlineA param1 param2) đã thực hiện công việc.
Lior Ohana

Câu trả lời:


17

Có vẻ như bạn đã tự làm việc này, nhưng bạn có thể sử dụng:

$(command parameter1 parameter2)

Chỉnh sửa chỉnh sửa: bên dưới có phần sai, trong khi nó chạy lệnh trong một lớp con, hóa ra các biến môi trường vẫn sẽ có sẵn. Xin lỗi vì đã khiến mọi người hiểu lầm ...

Chỉnh sửa: sẽ chạy trong một mạng con, mọi biến môi trường không được báo cáo sẽ không được sử dụng. Nếu bạn muốn chạy một lệnh trong cùng một shell, bạn cần sử dụng:

eval $(command parameter1 parameter2)

Một câu trả lời khác được đưa ra là để ống thông qua bash chính nó:

echo 'uname -a' | bash 

Điều đó cũng sẽ thực thi trong một lớp con, để chạy trong cùng một shell bạn sẽ cần:

echo 'uname -a' | bash -c

Ngẫu nhiên, bạn cũng có thể sử dụng dấu tick thay vì cú pháp $ (), nhưng điều đó không được khuyến khích .


(1) Tôi không biết chính xác ý của bạn là gì khi chạy trên một mạng con. Các biến môi trường không được báo cáo sẽ được sử dụng. (2) Tôi không thấy bất kỳ lý do để sử dụng evalở đây. Nếu bạn có một lý do, xin vui lòng giải thích nó. (3) Ví dụ cuối cùng của bạn (với  -c) là hoàn toàn sai.
Scott

Bạn đã đúng, tôi đã kiểm tra lại và tôi đã sai ở đó. Khi chạy dưới dạng danh sách, các bash shell và các biến môi trường vẫn có sẵn. Vì vậy, bạn là chính xác, xin lỗi về điều đó.
Chris Sherlock

4

Dùng cái này:

commandlineA param1 param2 | bash

Thí dụ:

echo "uname -a" | bash

Đầu ra:

Linux k1104 2.6,38-8-chung # 42-Ubuntu SMP Mon ngày 11 tháng 4 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux

Không có gì sai với điều này, tuy nhiên nó sẽ sinh ra một vỏ bash khác.
Chris Sherlock

Sẽ như vậy$(commandlineA param1 param2)
tripleee

@tripleee: Bạn đang so sánh cam và bí ngô.  printf '\143\144\040\057\n' | bashcuối cùng là không có, bởi vì lệnh được thực thi trong một tiến trình shell mới, riêng biệt (và nhất thời). Ngược lại, $(printf '\143\144\040\057\n')sẽ làm cho vỏ hiện tại, hoạt động, tương tác thay đổi thư mục.
Scott
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.