Tôi biết rõ về tiện ích source
(hay còn gọi là .
), tiện ích này sẽ lấy nội dung từ tệp và thực thi chúng trong trình bao hiện tại.
Bây giờ, tôi đang chuyển đổi một số văn bản thành các lệnh shell và sau đó chạy chúng, như sau:
$ ls | sed ... | sh
ls
chỉ là một ví dụ ngẫu nhiên, văn bản gốc có thể là bất cứ thứ gì. sed
quá, chỉ là một ví dụ để chuyển đổi văn bản. Điều thú vị là sh
. Tôi tẩu bất cứ thứ gì tôi có sh
và nó chạy nó.
Vấn đề của tôi là, điều đó có nghĩa là bắt đầu một trình bao phụ mới. Tôi muốn các lệnh chạy trong trình bao hiện tại của mình. Giống như tôi có thể làm được source some-file
, nếu tôi có các lệnh trong tệp văn bản.
Tôi không muốn tạo một tệp tạm thời vì cảm thấy bẩn.
Ngoài ra, tôi muốn bắt đầu trình bao phụ của mình với các đặc điểm giống hệt như trình bao hiện tại của tôi.
cập nhật
Ok, các giải pháp sử dụng backtick chắc chắn hoạt động, nhưng tôi thường phải làm điều này trong khi kiểm tra và thay đổi đầu ra, vì vậy tôi muốn có cách nào đó để chuyển kết quả thành một thứ gì đó cuối cùng.
cập nhật đáng buồn
Ah, /dev/stdin
thứ trông rất đẹp, nhưng, trong một trường hợp phức tạp hơn, nó không hoạt động.
Vì vậy, tôi có cái này:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Điều này đảm bảo tất cả .doc
các tệp đều có phần mở rộng được viết thường.
Và tình cờ, có thể được xử lý với xargs
, nhưng đó không phải là vấn đề.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Vì vậy, khi tôi chạy cái trước, nó sẽ thoát ra ngay lập tức, không có gì xảy ra.