(CHỈNH SỬA trong giải pháp có sed)Bash thoát dấu ngã và ký tự đại diện nhưng không phải dấu cách
Tôi có danh sách tên và thư mục, bao gồm dấu ngã và ký tự đại diện. Ví dụ .:
~/docs/file.*
~/my docs/*.txt
...
Tôi đọc các hàng và vượt qua chúng để một lệnh (ví dụ rsync):
while read ROW
do
rsync $ROW /my/dest/
done < list.txt
Vấn đề là xử lý với khoảng trống trong tên tập tin. Nếu tôi đặt $ ROW trong dấu ngoặc kép như thế này
rsync "$ROW" /my/dest/
bash khóa không thoát khỏi ký tự đại diện và dấu ngã. Nhưng nếu tôi không sử dụng dấu ngoặc kép thì không gian sẽ phá vỡ hàng.
Một giải pháp có thể là thay đổi IFS (cẩn thận: tập lệnh phức tạp hơn tập lệnh mà tôi đã báo cáo). Một giải pháp khác (nhờ sửa chữa cho Patrick Echterbruch) là để thoát khỏi không gian. Tuy nhiên, mã sau không hoạt động đối với tôi:
while read ROW
do
export NEWROW=$(echo $ROW | sed -e 's/ /\\ /g')
echo "Value: $NEWROW"
ls -1d $NEWROW
done < list.txt
Xin lưu ý rằng không có dấu ngoặc kép nào được chuyển cho ls. Các tập tin "~/a b c/test.txt" tồn tại, nhưng tôi nhận được:
Value: ~/saver/a\ b\ c/*.txt
ls: impossibile accedere a ~/saver/a\: Nessun file o directory
ls: impossibile accedere a b\: Nessun file o directory
ls: impossibile accedere a c/*.txt: Nessun file o directory
Có vẻ như NEWROW được chuyển cho ls như là một chuỗi, do đó ký tự đại diện không được mở rộng nhưng không gian giữ vi phạm tên tập tin, mặc dù đã trốn thoát.
Mẹo nào? Cảm ơn.
Vui lòng xem [điều này liên quan đến việc mở rộng dấu ngã] (http://mywiki.wooledge.org/BashPitfalls#echo_.22.2BAH4.22). –