Trong một kịch bản shell ...
Làm cách nào để tôi bắt stdin đến một biến mà không tước bất kỳ dòng mới nào?
Ngay bây giờ tôi đã thử:
var=`cat`
var=`tee`
var=$(tee)
Trong mọi trường hợp $var
sẽ không có dòng mới của luồng đầu vào. Cảm ơn.
CSONG: Nếu không có dòng mới trong đầu vào, thì giải pháp không được thêm vào .
CẬP NHẬT TRONG ÁNH SÁNG ĐÁP ÁN ĐƯỢC CHẤP NHẬN:
Giải pháp cuối cùng mà tôi đã sử dụng trong mã của mình như sau:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Nếu bạn muốn xem mã đầy đủ, vui lòng xem trang github cho expandr , một chút mã nguồn mở git lọc từ khóa mở rộng shell script mà tôi được phát triển cho mục đích an ninh thông tin. Theo các quy tắc được thiết lập trong các tệp .gitattribut (có thể là chi nhánh cụ thể) và git config , git ống từng tệp thông qua tập lệnh shell extendr.sh bất cứ khi nào kiểm tra nó vào hoặc ra khỏi kho lưu trữ. (Đó là lý do tại sao việc lưu giữ bất kỳ dòng mới nào hoặc thiếu thông tin là rất quan trọng.) Điều này cho phép bạn xóa thông tin nhạy cảm và trao đổi trong các bộ giá trị cụ thể khác nhau của môi trường để kiểm tra, dàn dựng và các nhánh sống.
filter
, thì nó sẽ thêm các ký tự dòng mới vào cuối của bất kỳ luồng đầu vào nào không kết thúc trong dòng mới ban đầu. Trong thực tế, ban đầu tôi chỉ làm filter
nhưng gặp phải vấn đề đó dẫn tôi đến giải pháp này bởi vì "không phải luôn luôn thêm dòng mới" hay "luôn luôn loại bỏ dòng mới" là giải pháp có thể chấp nhận được.
sed
có thể sẽ làm thêm dòng mới - nhưng bạn nên xử lý nó filter
không phải với tất cả phần còn lại. Và tất cả các chức năng mà bạn có về cơ bản đều làm điều tương tự - a sed s///
. Bạn đang sử dụng vỏ để dữ liệu ống nó đã được lưu trong bộ nhớ của nó để sed
sao cho sed
có thể thay thế mà dữ liệu với dữ liệu khác mà vỏ đã được lưu trữ trong bộ nhớ của nó để sed
can ống nó trở lại vỏ. Tại sao không chỉ [ "$var" = "$condition" ] && var=new_value
? Tôi cũng không nhận được các mảng - bạn đang lưu trữ tên mảng [0]
sau đó sử dụng sed
để thay thế nó bằng giá trị trong [1]
? Có lẽ trò chuyện?
filter
gì? Nó hoạt động hoàn hảo như vốn có. Về cách mã trong liên kết của tôi hoạt động và lý do tại sao tôi thiết lập mã theo cách tôi đã làm, vâng, hãy nói về nó trong phòng trò chuyện.
filter
mấtstdin
- nó chạysed
. Bạn bắtstdin
vào$GIT_INPUT
sau đó in nó trở lạistdout
qua một đường ống đếnfilter
và bắt nóstdout
vào$FILTERED_OUTPUT
và sau đó in lạistdout
. Tất cả 4 dòng ở cuối ví dụ của bạn ở trên có thể được thay thế bằng chỉ này :filter
. Không có ý xúc phạm ở đây, chỉ là ... bạn đang làm việc quá sức. Bạn không cần các biến shell trong hầu hết thời gian - chỉ cần hướng đầu vào đến đúng nơi và chuyển nó vào.