衝擊禁用雙迴聲
如果我執行一個普通的互動式 python 會話,輸入/輸出如下所示:
>>> 1 + 1; 2
現在我正在嘗試執行它
socat
,所以我啟動了一個“伺服器”socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr
並從另一個終端連接到它:
socat - UNIX-CONNECT:$HOME/socket
除了再次回顯輸入之外,這幾乎可以正常工作:
>>> 1 + 1; 1 + 1; 2
我怎樣才能關閉它?
echo=0
不做我想做的事:這在我打字時也隱藏了輸入,這不是很有幫助。我希望它像普通的互動式會話一樣工作。(使用 python 和本地域套接字只是一個範例;其他程序(例如 cat、lua 等)和其他套接字類型(例如 TCP 套接字)也是如此。
在客戶端寫這個。注意**“原始”**。
socat unix-connect:socket -,raw,echo=0
或者這個在伺服器端。注意“迴聲=0”
socat unix-listen:socket exec:"python",pty,echo=0
但不是兩者兼而有之。或者在伺服器 pty 上使用 echo=0 的客戶端 stdio 上的 raw 很好,但 echo=0 不能應用兩次。
讓我們看看兩個 1+1 的。它們是迴聲,但含義不同。第一個回顯來自客戶端的行緩衝,第二個來自 socat 創建的伺服器端的終端。
>>> 1 + 1; 1 + 1; 2
在客戶端 stdio 上單獨使用 echo=0 ,socat 通知其控制終端(即 xterm 或類似的東西)禁用 stdio 緩衝區的回顯(螢幕顯示),因此第一個 1+1 消失,第二個將顯示一旦按下返回鍵就在原地。伺服器 pty 上的 echo=0 可防止 socat 將接收到的輸入回顯(ping-pong)回客戶端,因此第二個 1+1 消失了。在客戶端使用raw時,stdio 的緩衝被禁用,因此每個密鑰都不會等到返回發送到伺服器,伺服器會立即回顯密鑰. 在客戶端 stdio 上使用 raw 以及在客戶端 stdio 上使用 echo=0 時,首先將其發送到伺服器,然後伺服器將其發送回並顯示在客戶端上。在客戶端 stdio 上使用 raw 並在伺服器 pty 上使用 echo=0 ,當按下一個鍵時,它會在發送到伺服器時同時顯示,但永遠不會發回。
對於命令行編輯,有時在客戶端緩沖一行就足夠了,在我們完成編輯這一行之前不發送整行。但是,如果需要強大的智能補全,則需要伺服器端的參與。