Shell-Script

vim 在 bashscript 中表現出奇怪的行為

  • March 29, 2020
#!/bin/sh

action() {

       screen -X stuff "xdotool key Ctrl+a $1"$(echo '\015')

}

action bar
screen
action 0
action Tab
action 1
action S
screen
action Tab
action 2
action Tab
vim
#action Tab
#vim $2
#action Tab
#vim $3
#action Tab

當 vim 行被註釋掉時 ,會按預期顯示以下輸出 中間一豎隔,豎隔右側一橫隔

當包含 vim 行時, 僅顯示兩個分區,由水平線分隔。 第一個分區顯示螢幕#1,第二個分區顯示螢幕#2。

vim 在螢幕 #0 中打開並且


l key Ctrl+a bar

寫著

在此處輸入圖像描述

無法了解 vim 是如何導致可能的錯誤的?請幫忙。

這裡發生的情況是螢幕的stuff命令將字元推入窗格的輸入緩衝區,但它們只是坐在那裡,直到有一個程序來使用它們。

由於您在窗格 #0 上執行此腳本並xdotool key Ctrl+a bar在該窗格 #0 上發出命令,因此當腳本結束並且您返回 shell 時,shell 將接受它並將其解釋為普通 shell 命令。

您實際上可以在您的第一個螢幕截圖中看到,您會在一行中看到字元本身(與您鍵入的一些字元相同),然後成為待處理的輸入。當腳本結束並且您返回 shell 時,它會消耗這些字元並最終重複該命令。結果如下所示:

xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$ xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$

如果您正在執行 Vim 而不是退出腳本,那麼 Vim 將使用相同的輸入並將其解釋為 Vim 命令。然後它會看到以下命令序列:

  • x:刪除游標下的字元。緩衝區是空的,所以只會發出嗶嗶聲,什麼也不做。
  • do: 從另一個緩衝區獲取差異(在 vimdiff 模式下很有用。)這在這裡沒有用,但在這種情況下它什麼也不做。
  • to: 移動到o這一行的下一個字元。該行是空的,所以這又什麼都不做。
  • o: 在目前行的下一行進入插入模式。

所以最後一個命令進入插入模式,這意味著該行的其餘部分 ( l key Ctrl+a bar) 和“Enter”被輸入到第二行的緩衝區中。Vim 留在第三行的開頭,仍處於插入模式。

所以這完美地解釋了這一點。

一個更簡單的複制器是執行一個命令,例如:

$ sleep 30; vim

然後在sleep執行時,在上面鍵入該行:

xdotool key Ctrl+a bar

因為sleep不會消耗它的輸出,所以當 Vim 啟動時,在睡眠結束後,該輸入將可供 Vim 使用。您會看到它的行為與上述相同,包括“嗶”聲(如果它在您的終端中啟用)。

引用自:https://unix.stackexchange.com/questions/575370