我想以一种非常具体的方式自定义我的 bash shell,具体到我不知道是否可行。目前,我的外壳是这样的:
myname@ubuntu /home/myname:
>>
其中 myname 是我的用户名。我在以下行中自定义了外壳~/.bashrc
:
PS1='${debian_chroot:+($debian_chroot)}\u@\h `pwd`:\n>> '
当我按 Enter 键时,会发生以下情况:
myname@ubuntu /home/myname:
>>
myname@ubuntu /home/myname:
>>
取而代之的是,我希望发生以下情况:
myname@ubuntu /home/myname:
>>
>>
此外,如果我输入一个命令,会发生什么应该是这样的:
myname@ubuntu /home/myname:
>> echo hello
hello
myname@ubuntu /home/myname:
>>
以下情况不应发生
myname@ubuntu /home/myname:
>>echo hello
hello
>>
这可能吗?如果是这样,该怎么做?
更新
多亏了 ChrisAga 的回应,我才得以实现我的目标。
这是脚本
# don't put duplicate lines or lines starting with space in the history.
HISTCONTROL=ignoreboth
customprompt() {
# the current number of lines in bash history:
bash_history_size=$(fc -l -1)
bash_history_size=${bash_history_size%%[^0-9]*}
# set an initial value to the number of lines
# in bash history stored from the last time
# this function was executed. This avoids bugs
# when running the first command in the current
# shell session
if [ -n "$bash_history_lastsize" ]; then
bash_history_lastsize=0
fi
# if the current number of lines in bash history
# is different from the last number of lines, then
# we print the user name and the current directory.
# otherwise, we just print >>
if [ "${bash_history_size}" != "${bash_history_lastsize}" ]; then
PS1='\[\033[01;32m\]\u@\h \[\033[00m\]`pwd`:\n>> '
else
PS1=">> "
fi
# update the last value to the current value
bash_history_lastsize=${bash_history_size}
}
PROMPT_COMMAND=customprompt
实际上,普通的 bash 有一个解决方案!
唯一的限制是与 bash 命令历史记录中的重复预防不兼容。因此,如果您不介意 bash 历史记录中有重复项,则可以在 bash 中设置以下内容
~/.bashrc
:默认情况下
HISTCONTROL=ignoreboth
,这相当于ignorespace:ignoredups
所以你必须改变它。该
pprompt
函数获取历史记录中的最后一条命令,并将其编号与先前存储的值进行比较。如果你只是按回车,数字不会改变,所以如果这个数字已经改变,我们将 PS1 设置为完整提示,否则,我们将其设置为>>
.最后
PROMPT_COMMAND=pprompt
,在回显主提示 ( ) 之前,需要 bash 来执行 pprompt$PS1
。NB1。如果您不喜欢将主路径显示为
~
,可以将 \w 替换为 `pwd`。NB2。如果我们可以获得实际的 bash 命令号(我们可以
!#
在提示符中显示的那个)而不是历史命令号,我们将获得与历史重复数据删除兼容的解决方案。据我所知,你不能简单地使用普通的 bash 来做到这一点。但相反,您必须几乎从头开始实现自己的 shell(不要害怕,我已经完成了,它只需要不到 30 行代码)。
这是代码(custom_shell.sh):
限制:
由于它不能使用 bash 中存在的行编辑功能,因此不能
Ctrl+C
用于中断或Ctrl+L
清除终端。并且没有命令完成和 shell 历史记录。安全考虑:
/tmp/custom_shell_buf
由于它在执行命令之前使用未加密的文件(所以毕竟作为一个爱好工作就足够了,它也满足了你的需求。如果你愿意,你可以添加更多的功能。
如果有人有更好的建议,我很高兴听到。
快乐的黑客;)