[英]echo backspace switch creates newline
我明白
\n = new line or carriage return
\b = move cursor to the left once (does not delete anything)
將這兩者放在此命令中時:
read -p "$(echo -e 'Enter your age: \n\b')"
那輸出:
Enter your age:
_
用_是你的光標要求輸入。
我的問題 :如果我刪除\\ b開關,光標將不在換行符上。 有人可以向我解釋這是如何工作的嗎?
從$()
命令替換中刪除尾隨換行符。 手冊頁:
命令替換允許輸出命令來替換命令名稱。 有兩種形式:
$(command)
要么
`command`
Bash通過執行
command
並用命令的標准輸出替換命令替換來執行擴展, 刪除任何尾隨換行符。 (......)
(強調我的)。
在沒有\\b
情況下實現相同行為的方法是使用特定於bash的$''
字符串:
read -p $'Enter your age:\n'
或者只是在引用的字符串中添加換行符:
read -p 'Enter your age:
'
格式不是很好,但它也可以工作。
(僅當我運行你的\\b
版本時,我的光標位於第一行的末尾,而不是在第二行的開頭,但這可能只是一個終端差異。)
舉例來說,比較一下:
$ printf "$(echo -e 'Enter your age: \n ')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 0a20 5f . _
還有這個:
$ printf "$(echo -e 'Enter your age: \n\b')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 0a08 5f .._
對此:
$ printf "$(echo -e 'Enter your age: \n')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 5f _
注意第一個輸出中的0a20
? 這是我們模式的新線和空間。
注意第二個輸出中的0a08
? 這是我們模式中的換行符和退格鍵。
現在看第三個輸出。 換行后我們沒有任何字符,所以我們在輸出中沒有看到20
或08
哪個有意義但換行在哪里去了?
事實證明這是命令替換的“特征”。
Bash通過執行命令並用命令的標准輸出替換命令替換來執行擴展,刪除任何尾隨換行符。
因此,通過在換行符之后放置\\b
,您可以保護它不被命令替換刪除。
Wintermute在他的答案中涵蓋了正確的解決方法/解決方案(你也可以將字符串放在變量中並在read
行的引號中展開它以使該行上的格式更好一些)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.