Shell-Script
vim 在 bashscript 中表現出奇怪的行為
#!/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 在螢幕 #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 使用。您會看到它的行為與上述相同,包括“嗶”聲(如果它在您的終端中啟用)。