Làm thế nào để thực hiện các dòng đến từ một kết quả grep?


10

Tôi đã có một tệp văn bản với một số hướng dẫn cài đặt nhất định và tôi biết rằng tôi có thể grep cho một lần xuất hiện duy nhất trong tệp. Ví dụ: tệp văn bản có nội dung như:

MYDIR = `find / home / user -name somedir`
xuất PERL5LIB = $ PERL5LIB: $ MYDIR

Trong bash, làm cách nào tôi có thể thực thi các dòng sau một grep trong tệp? Cái gì đó như:

thực hiện kết quả từ "grep somedir INSTALLFILE"
thực hiện kết quả từ "grep 'xuất PERL5LIB' INSTALLFILE"

2
Không thực hiện tự động trong thời trang này một chút nguy hiểm?
Faheem Mitha

2
@Faheem và @avilella: Hơn cả một chút tuổi teen, thực sự nguy hiểm! Ngoài ra, hơi mong manh.
Caleb

Câu trả lời:


4

Giả định:

  • bạn có quyền kiểm soát tệp này và không gặp nguy hiểm về mã độc
  • bạn muốn đặt các biến này trình bao hiện tại của bạn

Bạn có thể chuyển hướng các lệnh của bạn đến một tệp tạm thời và thực hiện điều đó:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

Hoặc bạn có thể đánh giá kết quả

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

Cập nhật một câu trả lời cũ. Những gì tôi sẽ làm hôm nay là sử dụng một sự thay thế quá trình:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

Lưu ý rằng source <(...), bạn cần bash 4 trở lên. Nó không hoạt động với các phiên bản cũ hơn (zsh vẫn ổn).
Stéphane Chazelas

11

Để đánh giá các dòng trong một quy trình shell riêng biệt:

grep somedir INSTALLFILE | sh

Để đánh giá các dòng trong quá trình shell đang chạy:

eval "$(grep somedir INSTALLFILE)"

+1 vì là người duy nhất nhìn thấy khu rừng xuyên qua rừng. Dưới đây xóa câu trả lời của tôi. @avilella: để thuận tiện, bạn có thể sử dụng -A 1hoặc -B 1làm cờ trên một hoặc các dòng khác grepđể tìm nạp cả hai dòng bằng một grep và sử dụng nó trong một trong các giải pháp @Gilles.
Caleb

Lưu ý rằng trên một số hệ thống shcó thể là một liên kết tượng trưng đến vỏ khác thay vì hệ thống bạn mong đợi, vì vậy kết quả có thể không dự đoán được. Để an toàn, cụ thể chính xác bao bạn đang mong đợi, ví dụgrep somedir INSTALLFILE | bash
thdoan

-2

Bạn đã cân nhắc sử dụng tính năng 'exec' của find như trong:

find somedir -name INSTALLFILE -exec {}\;

Tôi nghĩ rằng OP đang tìm cách thực hiện các kết quả quay trở lại, chứ không phải chạy mọi kết quả quay trở lại từ tìm kiếm.
Caleb
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.