允许编辑 ~/.bashrc 然后自动“获取”它的别名 - 为什么它不起作用?

允许编辑 ~/.bashrc 然后自动“获取”它的别名 - 为什么它不起作用?

我使用搭载 OSX 10.7.2 的 MacBook Air。

我想创建一个执行以下操作的别名:

  • 使用以下方式打开 TextMate~/.bashrc并允许我编辑它
  • 一旦我关闭 TextMate,“来源”~/.bashrc(因此,如果我添加一个新的别名,它将立即可用)

我尝试了以下操作:

alias b="/usr/bin/mate -w ~/.bashrc; source ~/.bashrc"

但它不起作用:当我关闭 TextMate 时,shell 没有返回(我没有看到 shell 提示符)。

有任何想法吗?

答案1

我没有 TextMate,但使用您的示例和 emacs 可以正常工作。可能是 TextMate 的问题?您可以尝试其他编辑器吗?

答案2

好的,这里有几个攻击角度:

1)简化。您是否尝试过别名之外的命令来查看它是否有效?

/usr/bin/mate -w ~/.bashrc; source ~/.bashrc

更好的测试可能是使用尚不存在的文件:

FILE=$TMPDIR/matewaiting-$(uuidgen); /usr/bin/mate -w $FILE; ls -al $FILE

如果您获得文件列表,则表示等待。如果您在文件中输入内容并保存后仍收到错误,则表示没有等待。

2)中的多个二进制文件$PATH 您没有提到您使用的是哪个版本,我们应该检查一下......

$ mate --version
mate 2.4 (2013-11-03 revision 9495)

如果您没有看到上述内容,而是看到类似 的内容mate r1577 (2012-07-11),则说明您的 中有多个 mate 二进制文件,$PATH并且您正在使用旧版本。在这种情况下,请反复运行以下命令并移动/重命名/删除任何较旧的 mate/mate_wait,直到您最终看到最新版本...或 中用尽匹配的命令$PATH

for MATE in mate{,_wait}; do
    p="$(which $MATE)"
    echo "$p: $("$p" --version)"
done

实际上,你应该也删除新的,因为它们可能已被cp“添加”(您永远不能对您的操作系统过于偏执 :-)。以下命令将命令硬链接到您的 /usr/local/bin,以便当它们被 TextMate 2 更新时/如果它们被更新,它们会自动更新:

# This is just in case you changed the TM2 bundle name in /Applications
# Using Spotlight...might as well, since it turns every Mac into a heliport...
[[ -n "$TM2" ]] || TM2="$(mdfind '(kMDItemCFBundleIdentifier=com.macromates.TextMate.preview)')"

if [[ -n "$TM2" ]]; then
    # Search for the mate binary within the TM2 directory
    MATE="$(find "$TM2" -name mate)"
    if [[ -n "$MATE" ]]; then
        # Hard-link both mate and mate_wait to the
        # mate binary into /usr/local/bin
        for cmd in mate{,_wait}; do
            ln -f "$MATE" /usr/local/bin/$cmd
            echo "Linked /usr/local/bin/$cmd to $MATE"
        done
    else
        echo "ERROR: No mate found in $TM2"
    fi
else
    echo "ERROR: Could not find TextMate 2 app bundle in /Applications."
    echo "Please set TM2 environment variable with full path"
fi

当然,这假设您有一个/usr/local/bin并且它实际上在您的$PATH(希望在/usr/bin和的前面/usr/sbin)...

3)抛弃别名! 我也有实物但我的是功能(读作:比字典中定义的别名更好)并且它是用轻微地更具防御性的编程(即针对我最大的敌人:!)这是我的.aliases档案

# Remove all aliases
unalias -a

alias aliases='alias '

# Re-read the aliases
realias() {
    local editor="${VISUAL:-emacs}"
    if [[ -z $editor ]]; then
        echo "realias: VISUAL environment variable unset" > /dev/stderr
        return
    fi
    [[ "$editor" =~ .*mate$ ]] && editor="$editor -w "
    "$editor" $HOME/.aliases
    source $HOME/.aliases
}

$VISUAL在我的 .bashrc 中设置为 emacs,但在 Mac OS X 上,它稍后会重置为$(which mate 2>/dev/null)

相关内容