Kết hợp mở rộng nẹp và chuyển hướng đầu ra


7

Thông thường, tôi sử dụng mở rộng tham số trên dòng lệnh, chẳng hạn như

cp a.{ext1,ext2}

mở rộng ra

cp a.ext1 a.ext2

Tuy nhiên, trong nhiều trường hợp tôi không sử dụng cp, nhưng một công cụ khác, hãy gọi nó catvà tôi sẽ thực hiện một số chuyển hướng đầu ra, như

cat a.ext1 > a.ext2

Trong trường hợp của tôi acó thể thay đổi, hoặc khá dài, vì vậy tôi muốn có thể sử dụng một số loại mở rộng niềng răng, mà ít nhất chỉ cần một lần xuất hiện atrong một lớp lót. Làm thế nào tôi có thể có được điều đó?

Tôi đặc biệt sử dụng

$ bash --version
GNU bash, version 3.2.51(1)

nhưng câu trả lời sử dụng vỏ khác cũng được đánh giá cao.

Câu trả lời:


11

Bạn có thể gõ:

$ cat very-long-filename.ext1Ctrl+WCtrl+Y>Ctrl+YBackspace2

Hoặc là:

$ cat very-long-filename.Ctrl+WCtrl+Yext1>Ctrl+Yext2

Để thực sự sử dụng mở rộng nẹp, lưu ý rằng:

cat a.ext1 > a.ext2

Cũng có thể được viết:

cat > a.ext2 a.ext1

Tuy nhiên, bạn không thể làm:

cat > a.ext{2,1}

Tuy nhiên, bạn có thể làm:

eval cat \> a.ext{2,1}

Chỉnh sửa thú vị! Với cat > a.ext{2,1}tôi nhận được một chuyển hướng mơ hồ. Có ai biết vì sao lại thế này không? Có {làm gì đặc biệt không?
Bernhard

@Bernhard Bạn nhận được rằng chuyển hướng nhập nhằng trong bashbất cứ lúc nào bạn vượt qua một cái gì đó mà mở rộng tới nhiều hơn một tham số để một nhà điều hành chuyển hướng. Tương tự trong a='a b'; echo > $a. Với zsh, điều đó sẽ làm một số mult_ios (phát ra đầu ra cho cả hai tệp)
Stéphane Chazelas

Điều đó có nghĩa là bash thực hiện chuyển hướng trước khi mở rộng? Tôi sẽ nghĩ rằng nó mở rộng đầu tiên, sau đó là operatres (về cơ bản giống như một bí danh), nhưng rõ ràng quan điểm của tôi là một chút ngây thơ.
Bernhard

Chi tiết hài hước: trong zsh, cat > a.ext{2,1} other_filekhông có chức năng. Nhưng nó sẽ tạo ra nội dung của other_fileđể cả hai a.ext1a.ext2. Tôi không biết làm thế nào nó quản lý để nhân đôi chuyển hướng.
lgeorget

@lgeorget, như tôi đã nói, đó là tính năng đa điểm trong đó zshthực hiện teenội bộ.
Stéphane Chazelas

2

Thế còn:-

f=really-long-filename; cat "$f.ext1" > "$f.ext2"

Điều đó hoạt động, nhưng không thực sự là những gì tôi đang tìm kiếm, vì tôi vẫn sẽ phải gõ lại${PR}
Bernhard

1

Sử dụng hàm shell

 xyx () { cat "$1".$2 > "$1".$3; }

sau đó

xyz fie foo fum

mở rộng đến

cat fee.foo > fee.fum

Phần mở rộng .1.2thường không phổ biến đối với tôi.
Bernhard

Sửa đổi câu trả lời để lấy tham số.
Lenne
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.