Có thể đặt tên cho một phần của lệnh để sử dụng lại nó trong cùng một lệnh sau này không?


7

Nếu tôi muốn di chuyển một tệp được gọi longfiletừ /longpath/đến, /longpath/morepath/tôi có thể làm gì đó như

mv (/longpath)/(longfile) $1/morepath/$2

tức là tôi có thể cho bash biết rằng nó nên nhớ một phần cụ thể của đầu vào để tôi có thể sử dụng lại sau này trong cùng một đầu vào không? (Trong ví dụ trên tôi sử dụng một lệnh ghi nhớ tưởng tượng hoạt động bằng cách đặt trong parantheses và một lệnh tái sử dụng tưởng tượng $để chèn nội dung của các nhóm)


2
Tại sao không phải là một biến sau đó?
heemayl

Ví dụ, ở trên phù hợp trong một dòng và không để lại hai biến không bao giờ được sử dụng lại. Tôi không chắc chắn nếu có nhiều lợi thế / ứng dụng hơn, tôi chủ yếu tò mò
Tunachach

Câu trả lời:


22

Bạn có thể làm điều này:

mv /longpath/longfile !#:1:h/morepath/

Xem https://www.gnu.org/software/bash/manual/bashref.html#History-Interaction

  • !# là lệnh hiện tại
  • :1 là đối số đầu tiên trong lệnh này
  • :h là "cái đầu" - nghĩ dirname
  • /morepath/ nối nó vào đầu
  • và bạn đang di chuyển một tập tin vào một thư mục, vì vậy nó giữ cùng tên cơ sở.

Nếu bạn muốn thay đổi tên "longfile", hãy nói thêm phần mở rộng ".txt", bạn có thể

mv /longpath/longfile !#:1:h/morepath/!#:1:t.txt

Cá nhân, tôi sẽ cắt và dán bằng chuột. Trên thực tế tôi không bao giờ được nhiều hơn nữa phức tạp hơn !!hoặc !$hoặc!!:gs/foo/bar/


14

Bạn cũng có thể làm điều này với mở rộng cú đúp:

mv /longpath/{,morepath/}longfile

Shell mở rộng điều này để mvlệnh nhìn thấy nó giống như:

mv /longpath/longfile /longpath/morepath/longfile

9

Nếu bạn đang gõ hiệu quả hơn trong dòng lệnh, bạn có thể thấy các phím tắt đọc khác nhau hữu ích. Readline đã được tích hợp sẵn trong vỏ của bạn. Đối với trường hợp cụ thể của bạn, bạn có thể kéo / xóa các phần của dòng của bạn và sau đó gọi lại chúng khỏi tiêu diệt đường đọc.

Hơn nữa, nếu bạn có biến môi trường EDITOR được đặt thành trình chỉnh sửa yêu thích của bạn, thì Ctrl-X, Ctrl-E sẽ sao chép dòng lệnh hiện tại của bạn vào cửa sổ trình chỉnh sửa nơi bạn có thể có tất cả sức mạnh của trình soạn thảo để sửa đổi dòng của mình. Sau khi hoàn thành, bạn lưu / thoát khỏi trình chỉnh sửa và dòng được thực thi trong trình bao của bạn.


Sau khi dành nhiều tuần để học vim, tôi thực sự buồn vì tôi vẫn phải giữ mũi tên trái trong bảng điều khiển mãi mãi để di chuyển trong các lệnh của mình. Bây giờ tôi có thể áp dụng tất cả ma thuật vim mới mua của mình cho điều đó. Tuyệt vời!
Tunea

2
@Bananach: bạn cũng có thể đặt bash thành vi-mode: set -o vitrong bashrc. Sau đó nhấn esc trên dòng lệnh sẽ đưa bạn vào chế độ bình thường của vim.
Nick Matteo

1
@kundor, tôi sử dụng set -o vibản thân mình, nhưng nó không mạnh bằng chế độ bình thường của Vim, nó có một tập hợp các lệnh của POSIX vi. Tuy nhiên, vẫn rất hữu ích và bạn có thể sử dụng <Esc>vđể mở lệnh chỉnh sửa trong Vim.
tự đại diện

4

Đối với một cái gì đó giống như trường hợp cụ thể mà bạn đang hỏi về, bạn cũng có thể sử dụng một lớp con.

mv (/longpath)/(longfile) $1/morepath/$2

trở thành

( cd /longpath; mv longfile morepath/ )

trong khi giữ thư mục làm việc hiện tại của bạn trong shell bạn đang làm việc.

Điều này không hoàn toàn giống với đề xuất sử dụng mở rộng shell của Wildcard nhưng có thể được thực hiện cho các tình huống phức tạp hơn là một điều đơn giản chỉ ở đây trong một đối số chỉ có thể hỗ trợ.


Đáng lưu ý rằng các không gian xung quanh dấu ngoặc đơn là dễ đọc; họ không cần thiết (không giống như sử dụng dấu ngoặc nhọn cho lệnh nhóm nơi tách khoảng trắng được yêu cầu).
tự đại diện
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.