sh - 每次 cd 在 FreeBSD 上成功更改到 sh 中的另一个目录时,如何使函数运行?
问题描述
我在 FreeBSD 上使用 sh 作为我的 shell,但我希望能够有一个漂亮的提示,就像在 Ubuntu 上给我的一个 bash 一样。就 PS1 转义字符而言,FreeBSD 的 sh 实现似乎缺少两点:
\w
作品但没有扩展$HOME
到~
,所以这是我自己已经破解的东西我可以使用 PS1 更新终端上的提示,但据我所知,也不可能使用 PS1 变量来更新标题栏。
ESC
如果他们使用 bash 或 ksh ,BEL
则无法按预期设置标题
这是我的 .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"
但那是在我意识到别名不除了参数之前。我该怎么做这样的事情?
解决方案
您可以使用函数而不是别名:
cd() {
command cd "$@" && update_prompt
}
把它放进去~/.shrc
。您必须使用command
here 让 sh 知道您指的是实际的cd
内置命令,而不是您刚刚定义的函数。
有关如何在sh(1)启动时获取文件的详细信息,请参阅sh(1)手册页:~/.shrc
因此,用户应该在文件中放置仅在登录时执行的
.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
推荐阅读
- c# - 自定义 Windows.Extensions.Logging 记录器未在 Akka.NET 参与者日志记录中使用
- javascript - Firebase:如何停止收听快照
- python - python shuffle和打印字符串并且没有反向字符串
- android - 为什么 Android Studio 不断切换“语言级别”?
- excel - 如何让 VBA 打印多页的标题列
- codenameone - Toastbar 消息与图标对齐
- oracle - Oracle 12c - 将字符串中的字符替换为空
- fasttext - 在另一个分类器中利用从 fasttext 分类模型中提取的词向量
- arrays - (VBA)我有一个 for 循环,可以在数组中搜索匹配项,它适用于除 5/68 以外的所有情况。为什么?
- javascript - 不可变地更新对象数组并管理长度归约