2016-01-14 142 views
4
我有我的知生成用戶輸入方法問題

提示:bash腳本用戶輸入提示

read -p "Input something: " variabile 

這會導致問題,如果嘗試使用箭頭鍵,它呼應了ANSI代碼每個箭頭鍵行程

read -e -p "Input something: " variable 

這修復箭頭鍵的問題,但在到達端子的寬度時,文本輸入不繼續上一個新行,但在同一行上,並覆蓋(目視)的現有的輸入

echo -n "Input something: "; read -e variable 

這顯然修復了以前描述的兩個問題......直到我發現鍵入某些東西然後按退格鍵會覆蓋提示,並且在輸入較長時,從第二個換行符輸入中,視覺覆蓋再次顯示。

那麼在沒有上述問題的情況下生成提示是否有好的方法?

UPDATE

重新檢查後,我現在知道是什麼引起的輸入改寫爲read -e -p 我使用這些變量的高亮顯示文本的閱讀提示:

highlight=$(echo -e "\e[1;97m") 
clear=$(echo -e "\e[0m") 
read -e -p "Input$highlight something$clear: " variable 

這是唯一的出路我可以在read提示符內(使變量分配轉義序列不起作用,我需要像我一樣回顯它們)進行突出顯示,但它們似乎也會導致輸入覆蓋問題。

+3

您是否嘗試*精確*'讀取-e -p「輸入內容:」變量「?或者提示包括VT-100控制檯代碼等顏色等改變?顯示提示時是否在左邊距上顯示光標?您在問題中顯示的命令完全適合我。 – rici

+1

你使用什麼樣的終端? 'putty'? – hek2mgl

+0

'read -e -p「輸入內容:」變量「適合我。 –

回答

1

shell會持續跟蹤它認爲提示是多久,以便知道用戶輸入開始和停止的位置。不幸的是,當你在提示符中打印顏色轉義碼時,你會拋出Bash的計數,因爲它期望轉義字符佔用終端空間。

爲了避免這種情況,您只需要將所有顏色序列包裝在\[ and \]中,這會告訴您的shell所附帶的字符不是正在打印,並且不應該被計數。

例如,您highlight變量應該是:

highlight=$(echo -e "\[\e[1;97m\]") 

就個人而言,我使用我的Prompt.gem項目,它處理的正確逃離color and pcolor功能,將使您的命令更容易閱讀:

+0

我試過你的包裝,但它沒有做任何事情來解決所描述的問題,而且''['和'\]'在提示中顯示,所以它們沒有任何影響。我甚至沒有使用'\'嘗試,除了顯示額外的'['和']''外,還是沒有效果。試着用'echo' +'read'和'read -e -p'。 BASH版本:'4.1.2(1)' –

+0

您是否正在使用自定義'PS1'提示符?你所描述的正是Bash無法正確確定光標應該在哪裏時發生的情況,所以這個問題可能不是特定於這個'read'命令。你能夠在一個乾淨的Bash環境中複製你的問題嗎?我還沒有能夠從您的示例中複製它,並且使用類似現代版本的Bash。 – dimo414

+0

沒有自定義PS1提示。也許最好給我一個關於適合你的快速語法內容的具體例子。 –

0

正如dimo414提到的,readline認爲提示比它長。它在計算長度時計算終端轉義序列中的每個字符。你可以看到它認爲多久轉義序列如下

echo ${#highlight} 

在bash的PS1提示,與"\[""\]"指示的readline忽略計算當前行的長度時之間一切都圍繞這樣一個轉義序列,但這些都是不是正確的內置bash的逃脫。

read的逃逸是$'\001'$'\002',如BashFAQ提及,但以我的經驗,你需要read-e選項,以及。蠻力的方式做你想要將是什麼:

read -e -p "Input "$'\001'"${highlight}"$'\002'something$'\001'"${clear}"$'\002'": " 

你應該使用tput的,而不是硬編碼的轉義序列,對終端獨立的緣故。閱讀man 5 termcap

請參閱my dotfiles以獲得優雅的bash函數,以便爲您完成上面的開始/結束引用。