Cách sử dụng biến thay vì tệp để xuất lệnh wc này


7

Tôi muốn đọc một tập tin từ một offset nhất định cho đến khi kết thúc tập tin đó.

Tôi cần lấy lại số byte đã đọc trong quá trình và cũng để chuyển hướng đầu ra của tệp ở nơi khác.

Đây là kịch bản của tôi:

...some stuff here...
dd if=$file bs=1 skip=$skippedBytes | tee >(wc --bytes > $file.count) >(cat - >> $file.output) | $($exportCommandString $file)
byteCount=$(cat $file.count)
rm $file.count
echo "Number of read bytes: $byteCount"

Tôi muốn phần "wc --bytes" đặt giá trị trả về của nó bên trong một biến để tôi có thể sử dụng nó sau mà không cần sử dụng tệp ($ file.count).

Cái gì đó như:

dd if=$file bs=1 skip=$skippedBytes | tee >(byteCount=$(wc --bytes)) >(cat - >> $file.output) | $($exportCommandString $file)
echo "Number of read bytes: $byteCount"

Ngoại trừ việc làm điều này, kịch bản của tôi bị treo và không hoạt động.

Có thể làm điều này và làm thế nào?


Vấn đề này đã được giải quyết nhưng được liên kết với vấn đề sau: unix.stackexchange.com/questions/67494/ mẹo
lauhub

Câu trả lời:


4

Bạn có thể sử dụng một hack nhỏ với chuyển hướng:

byteCount=$( exec 3>&1 ; 
     dd if=$file  bs=1  skip=$skippedBytes | tee -a >(wc -c >&3) $file.output |\
     $($exportCommandString $file) > /dev/null ;  3>&1   )

Nó chuyển hướng tất cả đầu ra thành 3, mà bạn đã tạo bằng exec, và sau đó trả nó về một đầu cuối.

Bạn cũng cần chuyển hướng tất cả đầu ra từ $ exportCommandString sang / dev / null, nếu không nó sẽ được trộn với đầu ra wc.

Tất cả stderr sẽ hoạt động như bình thường, không có bất kỳ thay đổi nào.

ps: bạn có thể sử dụng tee -a filethay vì tee >(cat - >> file)).

pps: Bạn không thể xuất các biến từ subshell, luôn được tạo trong khi sử dụng pipe |trong bash hoặc $(). Vì vậy, không có cách nào để làm một cái gì đó như

tee -a >(VAR=$(wc -c)) $file.output

Tôi đã sửa một lỗi đánh máy nhỏ (thiếu dấu ngoặc đơn đóng). Cảm ơn bạn cho câu trả lời đầy đủ này.
lauhub

1

Có lẽ một cái gì đó như thế này:

byteCount=$(tail -c +$skippedBytes $file | tee $file.output | wc -c)

Không chính xác những gì tôi đã mong đợi, nhưng nó cũng hoạt động. Cảm ơn
lauhub
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.