标签: prompt

有状态的 bash 函数

我想在 Bash 中实现一个函数,它在每次调用时增加(并返回)一个计数。不幸的是,这似乎很重要,因为我在子 shell 中调用该函数,因此它无法修改其父 shell 的变量。

这是我的尝试:

PS_COUNT=0

ps_count_inc() {
    let PS_COUNT=PS_COUNT+1
    echo $PS_COUNT
}

ps_count_reset() {
    let PS_COUNT=0
}
Run Code Online (Sandbox Code Playgroud)

这将按如下方式使用(因此我需要从子shell调用函数):

PS1='$(ps_count_reset)> '
PS2='$(ps_count_inc)   '
Run Code Online (Sandbox Code Playgroud)

这样,我就会有一个带编号的多行提示:

> echo 'this
1   is
2   a
3   test'
Run Code Online (Sandbox Code Playgroud)

可爱的。但由于上述限制不起作用。

一个无效的解决方案是将计数写入文件而不是变量。但是,这会在多个同时运行的会话之间产生冲突。当然,我可以将 shell 的进程 ID 附加到文件名。但我希望有一个更好的解决方案,不会让我的系统因大量文件而混乱。

bash prompt shell-script function subshell

17
推荐指数
2
解决办法
1798
查看次数

使用目录树/文件名时的紧凑 bash 提示

在带有 Ubuntu 14.04 和 的系统中bash,我的PS1变量以以下内容结尾:

\u@\h:\w\$
Run Code Online (Sandbox Code Playgroud)

以便提示显示为

user@machinename:/home/mydirectory$
Run Code Online (Sandbox Code Playgroud)

然而,有时,当前目录有一个长名称,或者它在长名称的目录中,所以提示看起来像

user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$
Run Code Online (Sandbox Code Playgroud)

这将填充终端中的行,光标将转到另一行,这很烦人。

我想获得类似的东西

user@machinename:/home/mydirectory1/...another_long_name$
Run Code Online (Sandbox Code Playgroud)

有没有办法定义PS1变量来“包装”和“压缩”目录名称,永远不会超过一定数量的字符,从而获得更短的提示?

bash prompt directory directory-structure pwd

17
推荐指数
2
解决办法
3171
查看次数

什么是 shell 中的百分号提示?

在观看视频时,我看到了以下内容:

% more tinyUF.txt
10
4 3
3 8
6 5
Run Code Online (Sandbox Code Playgroud)

命令%前的这个标志是什么more

command-line shell prompt

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

为什么这个 PS1 值会导致意外行为?

可能重复:
为什么浏览历史记录时我的 bash 提示会被窃听?

我已将我的PS1变量设置.bashrc为以下内容:

PS1='\e[35m[\W]:\e[0m '

它实现了预期目标(更改显示cwd在内部[]和之前的提示的颜色:),但是当我搜索我的命令历史记录时,有时我循环遍历的部分命令会附加到提示上。例如:

[~]: echo "something"
something
[~]: date
Sun Nov 18 17:07:54 PST 2012
[~]: sudo apt-get install vim
...
Run Code Online (Sandbox Code Playgroud)

现在,说我想回到我的echo "something"命令,我按下并得到

[~]: sudo apt-get install vim
Run Code Online (Sandbox Code Playgroud)

我再次按下,这发生了

[~]: sudo apt-date
Run Code Online (Sandbox Code Playgroud)

再起来

[~]: sudo apt-echo "something"
Run Code Online (Sandbox Code Playgroud)

如果我按退格键删除命令行上的所有内容,它会一直删除

[~]: sudo apt-
Run Code Online (Sandbox Code Playgroud)

它对命令没有影响。例如,该行[~]: sudo apt-date仍将打印等的输出date。为什么会发生这种情况,如何在没有副作用的情况下实现所需的提示?

bash prompt command-history

16
推荐指数
1
解决办法
2182
查看次数

\[\e]0 的含义;在 PS1 中的 .bashrc

.bashrc

case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

我明白${debian_chroot:+($debian_chroot)}\u@\h: \w,但不是\[\e]0;。它有什么作用?

bash prompt escape-characters

15
推荐指数
2
解决办法
7012
查看次数

根据 zsh 中的用户或 root 更改提示颜色

在 zsh 中,您可以%#PS1(或任何PROMPT变量)中有一个,这基本上意味着%如果是用户则显示或#如果是 root则显示。我想知道是否有任何方法可以影响这一点,以便%#改变颜色取决于它是用户还是根用户(根为红色,用户为蓝色)显而易见的方法只是改变PS1我的根~/.zshrc但考虑这已经是一个特殊的符号了,我想知道是否可能没有一种方法可以PS1对两者使用相同的符号......特定%#于 zsh 的东西(我敢肯定还有其他的 hacks 我也可以这样做)一个 if then 语句)。

shell colors prompt zsh

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

如何更改 tty 登录提示?

需要明确的是,我指的不是/etc/issue(在提示前显示)或/etc/motd(在登录后显示),而是提示本身,即当前

hostname login:
Run Code Online (Sandbox Code Playgroud)

总的来说,我正在运行 Arch Linux,但我相信答案很可能是跨发行版。

login prompt terminal tty

14
推荐指数
1
解决办法
3万
查看次数

为什么 $ 是用户 shell 的默认符号,而 # 是 root shell 的默认符号?

在服务器上运行标准的 bash shell,PS1 提示默认以 $ 结尾,非 root 用户,# 结尾。

IE:

ubuntu@server:~$ sudo su
root@server:/home/ubuntu#
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

shell prompt history

14
推荐指数
2
解决办法
3万
查看次数

在 shell 提示中显示 GNU 屏幕会话名称和窗口标题

有没有办法在 shell 的提示中显示 GNU Screen 会话名称和窗口标题(让我们说,由 定义的 Bash 提示PS1)?

bash prompt gnu-screen

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

每次显示新提示时,Bash 提示执行命令

我在 bash 中有以下提示,它显示了当前的 git 分支:

PS1+="$(git_prompt)" #git_prompt is a function in my .bashrc
Run Code Online (Sandbox Code Playgroud)

这在我获取 .bashrc 时有效,但在我更改分支时无效,因此 PS1 var 仅在我获取 .bashrc 时进行评估,但每次显示新提示时都应进行评估。这如何用 bash 4.3 完成?

bash prompt

13
推荐指数
2
解决办法
9497
查看次数