如果命令的输出不以a结尾\n,则后续的提示会立即显示:
$ echo -n hai
hai$
Run Code Online (Sandbox Code Playgroud)
我刚刚注意到一位同事的shell(zsh,它的价值)被配置为打印一个%(背景和前景颜色反转为强调),然后\n在这种情况下:
$ echo -n hai
hai%
$
Run Code Online (Sandbox Code Playgroud)
我也想这样做.我用Bash.这可能吗?如果是这样,我将添加到〜/ .bashrc中?
UPDATE
我花了几个小时了解gniourf_gniourf的解决方案是如何工作的.我将在这里分享我的发现,以防它们对其他人有用.
ESC[6n是用于访问光标位置的控制序列导入器(http://en.wikipedia.org/wiki/ANSI_escape_code).
\eecho在OS X上使用时,它不是ESC的有效表示形式(https://superuser.com/q/33914/176942).\033可以用来代替.
IFS是Bash的内部字段分隔符(http://tldp.org/LDP/abs/html/internalvariables.html#IFSREF).
read -sdR看起来像是速记read -s -d -R,但实际上"R"不是标志,它是(分隔符)选项的值-d.我决定写作read -s -d R以避免混淆.
双括号构造(( ... ))允许算术扩展和评估(http://tldp.org/LDP/abs/html/dblparens.html).
这是我的.bashrc中的相关片段:
set_prompt() {
# CSI 6n reports the cursor position as ESC[n;mR, where n is the row …Run Code Online (Sandbox Code Playgroud) 这是一个奇怪的问题,我无法与谷歌找到一个好的答案(当然,我总是有可能失败).在我的bash提示符下,如果我为提示的一部分着色,当我点击'up'转到上一个命令时,我不能在超过一定数量的字符(特别是31)之后转到该行的开头.
我当前的bash提示是:(颜色在我的.bashrc中定义)
PS1="[\u@$cyan\h$NC \w] "
Run Code Online (Sandbox Code Playgroud)
但如果我把它改成这个:
PS1="[\u@\h \w] "
Run Code Online (Sandbox Code Playgroud)
它不再阻止我走到行的开头.
奇怪的部分,在视觉上,当我回到家中去到行的开头(或使用箭头键)时它会将11个字符停在字符串中,但是如果我从那里编辑它,它会从头开始编辑这条线.
有谁知道为什么会发生这种情况?我希望在我的提示中使用颜色,因为我进行服务器管理,颜色是我如何区分我的盒子一目了然.
我知道我可以使用保存位置tput sc,但我怎样才能读取变量的位置?我需要行数.我不想使用curses/ncurses.
我想知道是否有一种方法可以从Elixir中获取命令行中的绝对光标位置.
我知道我必须使用以下ansi转义序列\ 033 [6n,执行后:
echo -en "\033[6n"
Run Code Online (Sandbox Code Playgroud)
打印正是我正在寻找的,但我不知道如何从Elixir得到命令响应.
谢谢!
我想在控制台的两行显示数据.我只是想每次更新两行.
我到现在所做的是 -
var _logInline = function(alpha, bravo) {
process.stdout.cursorTo(0, 0);
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write(alpha.toString());
process.stdout.write('\n');
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write(bravo.toString());
process.stdout.write('\n');
};
var delay = 1000;
var time = 0;
setInterval(function() {
time++;
_logInline('alpha-' + time, 'bravo-' + time * time);
}, delay);
Run Code Online (Sandbox Code Playgroud)
此解决方案的明显问题是光标移到窗口的顶部.我不希望这样,它应该显示当前光标所在的内容.可能我需要在我的逻辑中首先获得当前光标位置.有没有办法做到这一点?
替代方案和最优选的解决方案是获得可以执行相同操作的lib
编辑:我已经看到一些关于stackoverflow的问题,它提供了一个没有新行记录的选项,但这不是我想要的.我想要多个非新行记录.
我在OSX中使用bash命令行.我知道ANSI转义序列\ 033 [21t将检索当前终端窗口的标题.所以,例如:
$ echo -ne "\033[21t"
...sandbox...
$ # Where "sandbox" is the title of the current terminal window
$ # and the ... are some extra control characters
Run Code Online (Sandbox Code Playgroud)
我想要做的是在脚本中以编程方式捕获此信息,但我无法弄清楚如何做到这一点.脚本只捕获原始ANSI转义序列.所以,举一个例子,这个小Ruby脚本:
cmd = 'echo -ne "\033[21t"'
puts "Output from echo (directly to terminal):"
system(cmd)
terminal_name=`#{cmd}`
puts "\nOutput from echo to variable:"
puts terminal_name.inspect
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
Output from echo (directly to terminal):
^[]lsandbox^[\
Output from echo to variable:
"\e[21t"
Run Code Online (Sandbox Code Playgroud)
我希望第二种情况下的信息与终端上显示的信息相匹配,但我得到的只是原始命令序列.(我已尝试使用system()并将输出捕获到文件中 - 这也不起作用.)有没有人知道如何使其工作?
我正在尝试创建一个可更新的进度状态。为了做到这一点,我需要能够完全清除最后一个输出,以便我可以更新它。回车可以工作,但是当输出超过终端宽度并回绕时,将无法清除最后一个输出。所以我正在使用 tput:
n=0
while [[ $n -ne 100 ]]; do
n=$((n+1))
tput ed #clear
tput sc #save cursor
echo -n "Progress: ${n}%"
tput rc #restore cursor
sleep 1s
done
echo
Run Code Online (Sandbox Code Playgroud)
但是,如果输出足够长以致于强制终端向上滚动,这将失败。发生这种情况时,保存的光标位置不再正确,并且无法正确清除最后的输出。
例如,如果光标当前在终端的底部并且输出比终端宽度长,则会强制终端向上滚动,使之前保存的光标位置无效。
那么有没有什么办法可以保证Bash中的光标永远不会到终端结束呢?或者也许还有其他一些替代方法来防止这个问题?
编辑:我根据 F. Hauri 的回答制作了我自己的版本,简化了我的用例
#!/bin/bash
str=$(head -c 338 < /dev/zero | tr '\0' '\141')
len="${#str}"
col=$(tput cols)
lines=$(( ((len + col - 1) / col) - 1 ))
echo -ne "${str}\r"
(( len > col )) && tput cuu "$lines"
sleep 3s
tput ed
Run Code Online (Sandbox Code Playgroud)