我想在 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 附加到文件名。但我希望有一个更好的解决方案,不会让我的系统因大量文件而混乱。
在带有 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变量来“包装”和“压缩”目录名称,永远不会超过一定数量的字符,从而获得更短的提示?
在观看视频时,我看到了以下内容:
% more tinyUF.txt
10
4 3
3 8
6 5
Run Code Online (Sandbox Code Playgroud)
命令%前的这个标志是什么more?
我已将我的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。为什么会发生这种情况,如何在没有副作用的情况下实现所需的提示?
在 .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;。它有什么作用?
在 zsh 中,您可以%#在PS1(或任何PROMPT变量)中有一个,这基本上意味着%如果是用户则显示或#如果是 root则显示。我想知道是否有任何方法可以影响这一点,以便%或#改变颜色取决于它是用户还是根用户(根为红色,用户为蓝色)显而易见的方法只是改变PS1我的根~/.zshrc但考虑这已经是一个特殊的符号了,我想知道是否可能没有一种方法可以PS1对两者使用相同的符号......特定%#于 zsh 的东西(我敢肯定还有其他的 hacks 我也可以这样做)一个 if then 语句)。
需要明确的是,我指的不是/etc/issue(在提示前显示)或/etc/motd(在登录后显示),而是提示本身,即当前
hostname login:
Run Code Online (Sandbox Code Playgroud)
总的来说,我正在运行 Arch Linux,但我相信答案很可能是跨发行版。
在服务器上运行标准的 bash shell,PS1 提示默认以 $ 结尾,非 root 用户,# 结尾。
IE:
ubuntu@server:~$ sudo su
root@server:/home/ubuntu#
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
有没有办法在 shell 的提示中显示 GNU Screen 会话名称和窗口标题(让我们说,由 定义的 Bash 提示PS1)?
我在 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 完成?