Ngăn chặn thiết bị đầu cuối hiển thị lệnh đã thực hiện trước đó


7

Tôi có một kịch bản cho phép tôi ghi lại những suy nghĩ ngẫu nhiên trong khi làm việc trên một dự án. Trong terminal tôi sẽ thêm một mục nhật ký mới bằng cách chạy

$ @ "some random thought"

nơi @chỉ là một bí danh cho kịch bản của tôi.

Nói rằng thiết bị đầu cuối của tôi ở trong trạng thái này:

$ ls /var/tmp
somefile.ext
another-file.l
$ _

Sau khi chạy tập lệnh của tôi, nó sẽ trông như thế này:

$ ls /var/tmp
somefile.ext
another-file.l
$ @ "some random thought"
$ _

Bây giờ, tôi không muốn dòng đó ( $ @ "some random thought") ở lại trên màn hình sau khi tôi nhập nó. Tôi chỉ muốn tập lệnh chạy và không để lại dấu vết trên màn hình (một số thứ là cá nhân và một số người có thể thấy thiết bị đầu cuối của tôi). Tôi cũng không muốn cleartoàn bộ màn hình.

Bạn có nghĩ rằng điều này là có thể? Tôi đang sử dụng Iterm2 nếu điều này giúp.

NB: Tôi biết cách xử lý historyđể nó không ghi lại các mục nhật ký của tôi. Tôi chỉ muốn không để lại dấu vết trên màn hình.


Khi tôi trả lời @mutzmatron, điều này sẽ không giúp ích gì trong trường hợp của tôi.
whonoes 17/12/13

Vâng, tôi cũng nhận thấy điều đó.
Risto Salminen 17/12/13

Tôi nghi ngờ có một cách dễ dàng để xóa dòng cuối cùng của thiết bị đầu cuối. Giải pháp đơn giản nhất có lẽ là viết vỏ của riêng bạn.
Risto Salminen 17/12/13

Câu trả lời:


4

Bạn có thể thử ghi đè lên dòng trước đó, đã được trả lời;

Làm thế nào để thay đổi nội dung của một dòng trên thiết bị đầu cuối trái ngược với việc viết một dòng mới?

Ví dụ: (sửa đổi từ câu trả lời ban đầu):

prompt% echo -n "Old line"; echo "\033[1A\033[1A" "new line"

Sẽ chỉ hiển thị:

prompt% new line

Là đầu ra. Thêm nhiều \ 033 [Chuỗi 1A sẽ loại bỏ nhiều dòng hơn.

Hãy cẩn thận : Điều này không hoạt động trên tất cả các thiết bị đầu cuối.


Kịch bản của tôi không xuất ra bất cứ thứ gì. Tôi muốn xóa lệnh thực tế khỏi màn hình, không phải là đầu ra.
whonoes 17/12/13

Vâng, điều đó sẽ ghi đè lên dòng đầu ra kịch bản cuối cùng ; với ví dụ của bạn, tôi muốn prompt% echo -n "Old line"; echo -e "\e[0K\r new line"biến mất khỏi thiết bị đầu cuối.
whonoes 17/12/13

Bạn nói đúng, tôi đã cập nhật câu trả lời của mình với trình tự đầu cuối chính xác.
jmetz 17/12/13

1
Cảm ơn bạn mutzmatron, điều này giải quyết vấn đề của tôi. Một cảnh báo sẽ là nếu chuỗi tôi chuyển đến tập lệnh có nhiều hơn một dòng (văn bản kết thúc trong thiết bị đầu cuối), chỉ chuỗi cuối cùng sẽ bị xóa. Thêm nhiều \ 033 [Chuỗi 1A sẽ hoạt động, nhưng sau đó nếu tôi thêm một chuỗi chỉ bằng một dòng, nhiều hơn một dòng sẽ bị xóa khỏi thiết bị đầu cuối. Tuy nhiên, đủ tốt cho trường hợp của tôi, tôi sẽ chấp nhận câu trả lời của bạn, cảm ơn!
whonoes 17/12/13

1
Tôi vừa đăng câu trả lời tôi đang soạn, và bạn đánh tôi với nó. Giải pháp của riêng tôi sử dụng tput, không phải chỉ thị đầu cuối, vì vậy nó dễ mang theo hơn trên các thiết bị đầu cuối. Nó cũng hoạt động với đầu ra đa dòng - nhưng nó sẽ bị hỏng nếu đầu ra cuộn nhiều.
Alexios

7

Thay vì có một lệnh để nhập suy nghĩ của bạn, bạn có thể xác định một tiện ích cho điều đó. Trong zsh:

thought() { 
  print -r -- $BUFFER >> ~/.thoughts
  # or: your-script $BUFFER
  BUFFER=
  zle -M 'thought recorded'
}
zle -N thought
bindkey '^T' thought

Sau đó nhấn Ctrl-Tđể thêm nội dung của bộ đệm vào ~/.thoughtstệp của bạn và xóa nó sau đó ( BUFFER=). Sau đó, bạn không phải lo lắng về việc trích dẫn.

Một cách tiếp cận khác có thể là sử dụng các bình luận tương tác:

setopt interactive_comments
alias '@=:;#'
preexec() {
  [[ $1 = @* ]] && {
    print -r -- ${1#* } >> ~/.thoughts
    # or: your-script ${1#* }
    echoti cuu1
  }
}

Một lần nữa, không có vấn đề với trích dẫn, nhưng điều đó chỉ hoạt động cho những suy nghĩ dòng đơn. ( echoti cuu1chăm sóc xóa dòng đó bằng cách di chuyển con trỏ lên).


Điều này không vượt qua câu hỏi ...?
jmetz

Cảm ơn Stephane, nhưng tôi đã có một kịch bản hoạt động (python), hoạt động nhiều hơn một chút so với đăng nhập chuỗi. Giải pháp của bạn có nghĩa là tôi phải dọn rác tất cả và nó hơi phức tạp cho trường hợp đơn giản của tôi :) Câu trả lời của Mutzmatron đã giải quyết vấn đề của tôi.
whonoes 17/12/13

Tôi đã đưa ra câu trả lời này sau khi đăng bài của mình vì tôi nghĩ nó ít hơn so với hack thiết bị đầu cuối. Nhưng không có kế toán cho hương vị!
Alexios

@whonoes, chỉ cần thêm một cuộc gọi đến "tập lệnh của bạn" trong đó, đây print >> ~/.thoughtschỉ là một ví dụ để bất kỳ ai cũng có thể kiểm tra nó.
Stéphane Chazelas 17/12/13

@stephane, đây thực sự là một giải pháp thanh lịch hơn; Tôi chỉ muốn giải quyết mọi thứ trong kịch bản của mình (quá đơn giản để có một tiện ích như một phụ thuộc khi tôi có thể tránh điều đó, ngay cả khi sử dụng hack thiết bị đầu cuối)
whonoes 20/12/13

6

Cảnh báo, đây là một vụ hack khủng khiếp, khủng khiếp (nhưng sau đó, toàn bộ yêu cầu là một chút hack). :)

Đây là một cái gì đó sẽ hoạt động trên hầu hết các thiết bị đầu cuối, bao gồm cả trình giả lập MS-DOS 'ANSI.SYS'. Tất nhiên, sẽ không hoạt động trên các thiết bị đầu cuối câm (nhưng sẽ không có gì):

tput sc
echo "This will be hidden."
sleep 5
tput rc; tput cuu 1; tput ed

Rõ ràng, đây là một ví dụ. Thoát khỏi sự echosleepvà thay thế nó bằng lệnh của bạn. Đây là cách nó hoạt động:

  • tput sc lưu tọa độ hiện tại của con trỏ trên màn hình,
  • tput rcdi chuyển con trỏ trở lại tọa độ được lưu trữ. Bây giờ, màn hình có thể đã cuộn, vì vậy những thứ nhạy cảm sẽ nằm trên dòng phía trên cái đã lưu. Vì thế,
  • tput cuu 1di chuyển con trỏ lên một hàng (nếu bạn cảm thấy đặc biệt hoang tưởng, hãy thoải mái tăng số lượng.
  • Cuối cùng, tput edxóa đến cuối màn hình (nghĩa là xóa từ con trỏ đến cuối dòng, sau đó từ con trỏ xuống cuối màn hình).

Điều này sẽ thất bại về mặt hài hước nếu màn hình cuộn rất nhiều vì sckhông biết về cuộn, chỉ là tọa độ màn hình.

tputlà bất khả tri của thiết bị đầu cuối, vì vậy nó sẽ hoạt động miễn là thiết bị đầu cuối cụ thể của bạn được liệt kê trong cơ sở dữ liệu terminfo và TERMbiến được đặt chính xác.


Nâng cao tính di động - thực sự tuyệt vời!
whonoes

0

Chà, nếu đó chỉ some random thoughtlà lệnh thực tế, thì bạn có thể làm như vậy bằng cách thêm vào spacetrước thought. Nó sẽ loại trừ lệnh này đi vào lịch sử

satish@Satish:/tmp $ echo "I'm in history"
I'm in history
satish@Satish:/tmp $  echo "I'm not"
I'm not
satish@Satish:/tmp $ history | tail -n 3
 1887  sudo su -
 1888  echo "I'm in history"
 1889  history | tail -n 3
satish@Satish:/tmp $ 

2
OP muốn lệnh không có mặt trong thiết bị đầu cuối, không phải là lịch sử.
jmetz 17/12/13

Như đã đề cập trong câu hỏi, lịch sử không phải là vấn đề, tôi có thể quản lý điều đó. Với ví dụ của bạn, tôi muốn dòng này satish@Satish:/tmp $ echo "I'm not"bị ẩn khỏi thiết bị đầu cuối sau khi tôi chạy nó.
whonoes 17/12/13

Vâng ... tôi hiểu rồi .... sẽ xem liệu tôi có thể tìm ra giải pháp cho việc này không. Và sau đó sẽ đăng ở đây :)
SHW 17/12/13
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.