Đặt văn bản trong bộ đệm dòng lệnh bash


9

Tôi muốn lập trình đặt một đoạn văn bản nhất định vào bộ đệm dòng lệnh của bash, đọc để được chỉnh sửa và sử dụng như một lệnh.

Những gì tôi đang mong đợi là một cái gì đó tương tự read -inhưng cho các lệnh.

-i text Nếu đường đọc đang được sử dụng để đọc dòng, văn bản sẽ được đặt vào bộ đệm chỉnh sửa trước khi bắt đầu chỉnh sửa.

Chỉnh sửa : Với lập trình tôi có nghĩa là muốn viết điều này trong một tập lệnh , khởi chạy tập lệnh và chuẩn bị bộ đệm lệnh hoặc lịch sử lệnh được sửa đổi (như một số câu hỏi đã đề xuất).


IIRC screencó thể làm điều này cho bạn.
strugee

Câu trả lời:


6

Tôi tìm thấy một cách hacky để làm điều này trên trang ví dụ fzf . Điều này hoạt động với bash 4.3 và perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Nó in ra lệnh ra thiết bị xuất chuẩn, nhưng cũng sao chép nó vào bộ đệm lệnh. Ngoài ra còn có một ví dụ trên trang được liên kết nếu bạn muốn thực thi lệnh trực tiếp.


Câu trả lời này là gần nhất với những gì được OP yêu cầu.
reza.safiyat

Cú pháp hơi khác nhau trong câu trả lời này , &TIOCSTIlà một chút tốt hơn so với 0x5412quá. Đáng chú ý là có vẻ như một số nền tảng (ví dụ OpenBSD ) vô hiệu hóa TIOCSTI. Tôi nghĩ điều đó có nghĩa là cả cách tiếp cận này và zsh print -zsẽ không hiệu quả.
dimo414

4

Nếu điều này cho một chức năng mà bạn sẽ sử dụng trong một ràng buộc về đường đọc bind -xthì bạn có thể sửa đổi READLINE_LINE. ( Ví dụ )

Bên ngoài một ràng buộc đọc, bạn có thể đẩy một lệnh giả vào lịch sử với history -s.


Vấn đề là nếu tôi thực hiện history -s 'foo'trong một kịch bản, lịch sử của trình vỏ được khởi chạy hoàn toàn không được sửa đổi
gioele

@gioele Bạn phải khởi chạy nó từ trong trình bao (ví dụ: từ tập lệnh mà bạn tải source). Bạn không thể làm bất cứ điều gì từ một quy trình riêng biệt.
Gilles 'SO- đừng trở nên xấu xa'

2

Câu trả lời của Gilles là đúng, nhưng không hoàn toàn thỏa mãn. Khi tôi đọc câu hỏi này, OP muốn "cắt tỉa" dòng đầu vào tiếp theo. Trong trường hợp của tôi, tôi muốn đọc vị trí hiện tại của thiết bị đầu cuối trong chức năng PROMPT_COMMAND của mình. Nó hoạt động nhưng sử dụng bộ đệm đọc giống như trình bao chính, và vì vậy, bất kỳ đầu vào nào của người dùng đều bị loại bỏ bởi thực tế là tôi đã thực hiện một cuộc gọi dựng sẵn 'đọc' trong hàm. Vì vậy, tôi muốn đọc riêng đầu vào của người dùng, đọc thiết bị đầu cuối của tôi và sau đó đặt đầu vào đọc trở lại vào bộ đệm đầu vào, đó là câu hỏi ban đầu. Lưu ý rằng điều này thực sự nằm trong cùng một quy trình, vì vậy về mặt lý thuyết là có thể.

Theo như tôi có thể thấy (trên bash 4.2 của tôi) không có chức năng đẩy thứ gì đó vào ngăn xếp đầu vào theo chương trình. Trong zsh có sử dụng 'print -z'.

Vì vậy, câu trả lời là: điều này là không thể trong bash, bạn cần sử dụng zsh cho việc này.


0

Để thay thế để history -s 'foo'thử:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -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.