我在FreeBSD上使用sh作为我的shell,但是我希望能够有一个漂亮的提示,例如在Ubuntu上一个bash给我的提示。就PS1转义字符而言,sh的FreeBSD实现似乎缺少两件事:
\w
可以工作,但不能将$HOME
扩展到~
,所以这是我自己已经掌握的东西
我可以使用PS1更新终端上的提示,但据我所知,也无法使用PS1变量来更新标题栏。 ESC
和BEL
无法使用bash或ksh设置标题,就像期望的那样
这是我的.shrc文件
update_prompt() {
case "$PWD" in
"$HOME"*)
pretty_pwd="~${PWD#*"${HOME}"}"
;;
"/usr$HOME"*)
pretty_pwd="~${PWD#*"/usr${HOME}"}"
;;
*)
pretty_pwd="$PWD"
;;
esac
case "$TERM" in
xterm*|rxvt*)
PS1="[$USER@\\h $pretty_pwd]\\$ "
;;
*)
;;
esac
printf "\\033]0;[%s@$(hostname -s): %s]\\007" "$USER" "$pretty_pwd"
}
update_prompt
因此,当我启动终端或通过ssh登录时,它会给出我喜欢的漂亮提示。但是现在我需要在每次执行cd并返回退出状态0时运行此函数。
我打算使用类似以下的别名:
alias cd="cd $1 && update_prompt"
但是那是在我意识到别名不只是参数之前。我该怎么做这样的事情?
答案 0 :(得分:5)
您可以使用函数代替别名:
cd() {
command cd "$@" && update_prompt
}
只需将其放入~/.shrc
中即可。您必须在此处使用command
才能让您知道您是在指实际的cd
内置命令,而不是刚刚定义的函数。
有关如何使~/.shrc
文件在启动时sh(1)来源的详细信息,请参见sh(1)手册页:
因此,用户应放置仅在登录时执行的命令
.profile
文件中的时间,以及每个shell执行的命令 在ENV
文件中。用户可以通过将ENV
变量设置为某个文件 主目录文件.profile中的以下行,替换为.shrc
所需的文件名:ENV=$HOME/.shrc; export ENV
我在cd
别名管理器中使用了这个技巧。这是该函数的源代码的链接:https://github.com/0mp/goat/blob/v2.5.0/libgoat.sh#L31-L57
答案 1 :(得分:0)
如果您交换命令,则可以使用别名+参数来实现:
$ alias cd="echo change; cd"
$ pwd
/nas
$ cd /
change
$ pwd
/
$ cd /etc
change
$ pwd
/etc
$