簡體   English   中英

echo backspace開關創建換行符

[英]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 這是我們模式中的換行符和退格鍵。

現在看第三個輸出。 換行后我們沒有任何字符,所以我們在輸出中沒有看到2008哪個有意義但換行在哪里去了?

事實證明這是命令替換的“特征”。

Bash通過執行命令並用命令的標准輸出替換命令替換來執行擴展,刪除任何尾隨換行符。

因此,通過在換行符之后放置\\b 您可以保護它不被命令替換刪除。

Wintermute在他的答案中涵蓋了正確的解決方法/解決方案(你也可以將字符串放在變量中並在read行的引號中展開它以使該行上的格式更好一些)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM