Đây là một cách khác để làm điều đó rất giống với câu trả lời của Wildcard :
files=( file1.csv file2.csv)
eval paste "<( cut -d, -f1 ${^files[@]} )"
Thay vì một for
vòng lặp, điều này sử dụng việc ${^ ... }
mở rộng dành riêng cho Zsh.
Lý do files
phải được chỉ định trước tiên là vì việc tạo hình cầu luôn luôn được thực hiện sau cùng, vì vậy nếu files
cần được tạo tự động (như trong files=( *.csv )
) thì một cái gì đó ${^:-( *.csv )}
sẽ chỉ mở rộng sau khi tất cả các mở rộng khác đã xảy ra. Chúng tôi muốn nó mở rộng đầu tiên .
Việc ${^ ... }
mở rộng làm cho mảng kết quả hoạt động giống như kết quả của việc mở rộng dấu ngoặc. Ví dụ, gán x=(a b)
và sau đó so sánh echo ${x}y
với echo ${^x}y
.
Việc trích dẫn là cần thiết để lừa Zsh đối xử với văn bản xung quanh như một chuỗi ký tự. Nếu không, nó sẽ phân chia dòng lệnh tại các khoảng trắng, vì vậy ${^ ... }
việc mở rộng của chúng tôi sẽ giảm xuống ""${^ ... }""
; nghĩa là, mỗi phần tử sẽ chỉ được bao quanh bởi một chuỗi rỗng. Đó là,
echo "<( cut -d, -f1 ${^files[@]} )"
và
echo "<( cut -d, -f1 "\
${^files[@]}\
" )"
là tương đương, nhưng không giống như
echo <( cut -d, -f1 ${^files[@]} )
Nhưng trích dẫn giới thiệu một vấn đề mới: dòng lệnh được phân tích cú pháp và phân tách mà không liên quan đến việc mở rộng đang diễn ra. Đó là, mặc dù chúng tôi đã nhập một cách hiệu quả
paste <( cut -d, -f1 file1.csv ) <( cut -d, -f1 file2.csv )
như mong muốn, thực tế đây là phân tích cú pháp như
paste '<( cut -d, -f1 file1.csv )' '<( cut -d, -f1 file2.csv )'
Do đó, chúng ta cần eval
phân tích lại biểu thức được tạo chính xác. Để thấy điều này trong hành động, so sánh
setopt noxtrace
eval paste "<( cut -d, -f1 ${^files[@]} )" 1>/dev/null 2>&1
đến
setopt xtrace
eval paste "<( cut -d, -f1 ${^files[@]} )" 1>/dev/null 2>&1
Tôi hy vọng rằng một số sự kết hợp các hoạt động mở lồng nhau, các ${ ... :- ... }
mở rộng, và những lá cờ mở rộng tham số Q
, z
và / hoặc s
sẽ dẫn đến đánh giá lại mà không eval
, nhưng rõ ràng đó không phải là trường hợp. Tôi cũng ước có một cách để buộc toàn cầu, nhưng một lần nữa điều đó dường như là không thể.