Có một cách thanh lịch để đặt biến shell cho nội dung của tệp không?


11

Nói rằng tôi có một số dữ liệu cấu hình trong một tập tin config. Để thuận tiện, tôi muốn tải dữ liệu này vào một biến shell , CONFIG_DATA.

Rõ ràng tôi có thể làm:

CONFIG_DATA="$(cat config)"

Nhưng loại này cảm thấy như một công dụng vô dụng đốicat với tôi. Đây có phải là cách duy nhất để làm điều này? Hoặc có một cách thanh lịch hơn để làm điều đó?

Câu trả lời nên thích POSIX nhưng có thể sử dụng bất kỳ shell nào.


2
Đọc toàn bộ tập tin trong bộ nhớ như thế này hầu như luôn là một ý tưởng tồi, bất kể bạn viết nó như thế nào.
Satō Katsura

2
@SatoKatsura trong một số trường hợp rất đúng. tuy nhiên với mục đích của câu hỏi này, bạn có thể cho rằng tệp siêu nhỏ, vì vậy nó không phải là vấn đề lớn.
strugee

1
@SatoKatsura: tại sao?
RemcoGerlich

Câu trả lời:


23

Trong Bash và shell Z, ít nhất, có một cách nhanh hơn:

CONFIG_DATA=$(<config)

Để trích dẫn từ trang man của Bourne Again:

Lệnh thay thế $ (tệp cat) có thể được thay thế bằng $ (<file) tương đương nhưng nhanh hơn.


1
Tôi không coi đây là một lựa chọn tốt. Dù cảm giác của OP đối với việc sử dụng mèo vô dụng là gì, ví dụ của OP đủ đơn giản để hầu hết người dùng Bash hiểu điều đó. Nó cũng khá di động. Bây giờ $(<file)ít phổ biến hơn, vì vậy nó có thể dẫn đến nhiều WTF hơn; và tốc độ đạt được từ hoạt động này, nếu cấu hình như vậy được tải vào một biến, có thể không đáng kể
MatthewRock

6
@MatthewRock lưu ý rằng rất nhiều thực tiễn rất xấu là phổ biến và quen thuộc. Việc sử dụng vô dụng của mèo là một ví dụ, for i in $(cat file); do ...là một ví dụ khác. Rằng họ là phổ biến là không có lý do để tiếp tục sử dụng các công cụ xấu. Điều đó không có nghĩa là việc sử dụng con mèo đặc biệt này cũng là một điều tồi tệ, tôi không chắc có cách nào di động hơn không. Chỉ cần nói rằng phổ biến và quen thuộc! = Tốt.
terdon
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.