相关疑难解决方法(0)

将shell配置为始终在新行上打印提示,如zsh

如果命令的输出不以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的解决方案是如何工作的.我将在这里分享我的发现,以防它们对其他人有用.

这是我的.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 shell prompt

15
推荐指数
1
解决办法
3356
查看次数

Bash提示历史问题

这是一个奇怪的问题,我无法与谷歌找到一个好的答案(当然,我总是有可能失败).在我的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个字符停在字符串中,但是如果我从那里编辑它,它会从头开始编辑这条线.

有谁知道为什么会发生这种情况?我希望在我的提示中使用颜色,因为我进行服务器管理,颜色是我如何区分我的盒子一目了然.

bash command-prompt .bash-profile

13
推荐指数
1
解决办法
1516
查看次数

如何在终端中获取光标位置?

我知道我可以使用保存位置tput sc,但我怎样才能读取变量的位置?我需要行数.我不想使用curses/ncurses.

linux terminal position cursor

11
推荐指数
1
解决办法
2万
查看次数

在命令行中获取光标位置(Elixir)

我想知道是否有一种方法可以从Elixir中获取命令行中的绝对光标位置.

我知道我必须使用以下ansi转义序列\ 033 [6n,执行后:

echo -en "\033[6n" 
Run Code Online (Sandbox Code Playgroud)

打印正是我正在寻找的,但我不知道如何从Elixir得到命令响应.

谢谢!

elixir

11
推荐指数
2
解决办法
608
查看次数

如何更新多行控制台上的数据

我想在控制台的两行显示数据.我只是想每次更新两行.

我到现在所做的是 -

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的问题,它提供了一个没有新行记录的选项,但这不是我想要的.我想要多个非新行记录.

javascript console node.js

6
推荐指数
1
解决办法
2029
查看次数

如何使用ANSI转义序列捕获bash中终端窗口的标题?

我在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()并将输出捕获到文件中 - 这也不起作用.)有没有人知道如何使其工作?

ruby terminal

5
推荐指数
1
解决办法
1713
查看次数

Bash - 正确清除最后一个输出

我正在尝试创建一个可更新的进度状态。为了做到这一点,我需要能够完全清除最后一个输出,以便我可以更新它。回车可以工作,但是当输出超过终端宽度并回绕时,将无法清除最后一个输出。所以我正在使用 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)

bash tput

5
推荐指数
1
解决办法
171
查看次数