在提示符中使用 cowsay 函数时,我想在提示符后换行:
read -p "$(cowsay "do you know this word?") \n" answer
这个问题有多种答案:
1) https://stackoverflow.com/questions/4296108/how-do-i-add-a-line-break-for-read-command/4296147
2) https://stackoverflow.com/questions/12741529/how-to-break-a-line-add-a-newline-in-read-p-in-bash
但是答案使用''
符号,它不能解析cowsay
命令
为什么要使用
-p
需要bash
shell 的选项?做就是了:
在
bash
中,该-p
选项仅与(使'表现得像's的-e
另一个扩展名)一起使用,在某些情况下可能需要重绘提示(例如 on )。但是,当它是多行时,您可能不需要也不希望它重绘该提示。bash
bash
read
zsh
vared
bash
Ctrl+L如果你愿意,你总是可以这样做:
(这里使用
$'...'
理解类 C 转义序列的 ksh93 的引用形式)或者
更一般地说,问题在于命令替换会从命令输出的末尾删除换行符(不仅仅是一个,所有这些都可能被视为错误/错误功能¹)。
为了解决这个问题,通常的技巧是:
也就是说,添加
.\n
到输出中。命令替换去掉了\n
,我们去掉.
了${output%.}
整个命令的输出(前提是它在除 之外的 shell 中不包含 NUL 字符zsh
,并且它是当前语言环境中的有效文本yash
)。作为记录,在其他类似 Korn 的 shell 中,
read
自行发出提示的语法是:set -o emacs
当从终端读取并且启用了编辑器选项(如使用orset -o vi
)时,Korn shell 也会重绘该提示。zsh
也支持该语法以实现兼容性,但行编辑器仅用于vared
,而不用于read
那里。¹例如,它会使事情
basename=$(basename -- "$file")
出错,因为它可能会从文件名的末尾删除换行符,而不仅仅是由basename