在FreeBSD上,每次cd成功更改到sh中的另一个目录时,如何使函数运行?

时间:2018-06-29 18:55:55

标签: sh freebsd

我在FreeBSD上使用sh作为我的shell,但是我希望能够有一个漂亮的提示,例如在Ubuntu上一个bash给我的提示。就PS1转义字符而言,sh的FreeBSD实现似乎缺少两件事:

  1. \w可以工作,但不能将$HOME扩展到~,所以这是我自己已经掌握的东西

  2. 我可以使用PS1更新终端上的提示,但据我所知,也无法使用PS1变量来更新标题栏。 ESCBEL无法使用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"

但是那是在我意识到别名不只是参数之前。我该怎么做这样的事情?

2 个答案:

答案 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
$