Thay thế tham số trong sh -c


0

Tôi có một số lượng lớn các tệp nhật ký, ý tưởng là nhóm chúng theo ngày / tháng và sau đó đóng gói vào kho lưu trữ.
Đây là kịch bản của tôi:

find /c/this/path/ -type f -name "$file_pattern" | xargs -I fn basename fn | cut -c$start-$end | uniq | xargs -I {} sh -c "tar zcvf {}-$postfix.tgz {}$file_pattern"

tất cả các biến được xác định. Tuy nhiên, khi tôi thực thi điều này (gọi một hàm chứa tập lệnh này), kho lưu trữ không được tạo và không có lỗi nào được hiển thị. Khi tôi chạy thủ công, với các tham số được mã hóa cứng, nó hoạt động tốt. Tôi đoán là tôi đã thay đổi tham số.
Nhân tiện, tôi chạy cái này trên Windows bằng các lệnh đi kèm với cài đặt msysgit (nếu điều này tạo ra sự khác biệt).


Chèn một echo trước sh -cđể xem những gì xảy ra.
Cyrus

Bạn đã xuất khẩu chúng? Bởi vì sh -c gọi subshell mới
Romeo Ninov

@RomeoNinov có nghĩa là gì khi xuất khẩu?
chester89

xuất VARIABLE = value
Romeo Ninov

@RomeoNinov Tôi thấy. không, các biến được định nghĩa bên trong một tập lệnh và đọc từ các tham số
chester89

Câu trả lời:


1

Nếu tôi hiểu câu hỏi của bạn, bạn muốn biết cách truyền đối số cho tập lệnh được chỉ định bởi -c

...|xargs -I {} sh -c 'tar zcvf "$1"-'"$postfix"'.tgz "$1"'"$file_pattern" _ {}

Đối số đầu tiên sau khi kịch bản ( _) sẽ trở nên $0trong sh, và các số tiếp theo ( {}từ xargs) sẽ $1. Sự pha trộn của dấu ngoặc đơn và dấu ngoặc kép hơi lộn xộn nhưng cần thiết vì bạn có một số thông số bạn cần thay thế ngay bây giờ và một số bạn cần shxử lý.



0

Bạn phải gọi các biến của mình như thế này ${variable}thay vì $variableđó cũng là quy ước để viết nó trong Caps như vậy${VARIABLE}


0

Dường như với tôi rằng tôi hiểu vấn đề. Bản thân kịch bản là tốt. file_potype được định nghĩa như sau: file_pattern=*.logTuy nhiên, trong thư mục hiện tại tôi có tệp khớp với ký tự đại diện đó (ví dụ: Something.log) - và biến file_potype được điền với tên của tệp đó. Sau khi tôi gói đánh giá file_potype trong dấu ngoặc kép, mọi thứ đều ổn. Có thể ai đó sẽ cho tôi biết tại sao một bản mở rộng như vậy?
EDIT Tôi đã thoát khỏi dấu sao như thế này: file_pattern=\*.logvà kịch bản hoạt động tốt

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.