问题描述
我想将新别名添加到我的.bash_profile
文件中,但我找不到此文件。它应该在哪里?
最佳解决方案
它是一个隐藏文件,位于您的主文件夹中:
~/.bash_profile
(~
扩展到您的主目录。如果您的用户名是user
,结果将是:/home/user/.bash_profile
)。
因为它是一个隐藏文件,所以你必须让它可见。要在Nautilus中执行此操作,请转到”View”菜单并选中“显示隐藏文件”(或按快捷键Ctrl
+ H
)。
如果您将Kubuntu与Dolphin一起使用,则必须按Ctrl
+ .
才能切换文件的可见性。
次佳解决方案
~/.bash_profile
不是放置别名和功能的正确位置。他们应该进入~/.bashrc
。有关说明,请参阅http://mywiki.wooledge.org/DotFiles。
第三种解决方案
将所有别名放在用户主目录中的~/.bash_aliases
中非常方便。这是评论中~/.bashrc
文件中的建议。
第四种方案
你通常在Ubuntu上没有.bash_profile
,nor should you通常会创建该文件。作为jpezz says,它将位于您的Ubuntu系统的主目录中,这就是~
所代表的,您可以在那里创建它。但是如果你这样做,你应该小心,因为它会阻止bash
自动运行.profile
中的命令 – 你几乎肯定会这样做。
当bash
runs as a login shell,在WSL或other1中,它运行您的主目录中存在的第一个.bash_profile
,.bash_login
或.profile
。如果您在登录时要运行bash
特定命令 – 但仅当bash
是您的shell时 – 您可以将它们放在.bash_profile
中。但仅仅存在.bash_profile
会阻止使用.profile
。
那么你想要来自.bash_profile
的source .profile
,假设你想要运行那些命令,你几乎总是这样。您可以通过将此命令放在.bash_profile
中来实现:
. ~/.profile
(有些读者可能习惯于在启动脚本中看到它写成. "$HOME/.profile"
。这总是很好 – 你可能更喜欢将它用于需要在bash
以外的shell上工作的命令,如果你需要容纳的话不支持standard features的极旧shell,嗯,你不需要它。在任何情况下,bash
总是支持tilde expansion,而.bash_profile
的点是只有bash
运行它的命令,所以. ~/.profile
没问题。)
.
内置源文件,也就是说它运行当前shell中文件的所有命令。打开交互式bash
shell并运行help .
以获取更多信息。
你通常没有.bash_profile
在Ubuntu上要在登录时运行命令特异性的原因,即使你有bash
是,默认情况下,用户的.profile
文件包含检查,如果当前shell是bash
代码,然后导致这样的要运行的命令。
关于.profile
或.bash_profile
等文件的问题还有另一个答案。这些文件的默认版本存在于/etc/skel
目录中。在Ubuntu系统上创建用户帐户时,该目录中的文件将被复制到Ubuntu主目录中 – 包括您在安装Ubuntu时创建的用户帐户。如果查看该目录,您会注意到有一个名为.profile
的文件 – 以及其他一些文件,如.bashrc
– 但是没有名为.bash_profile
的文件。这就是为什么 – 或者,实际上 – 如何 – 除非您自己创建了.bash_profile
,否则您的Ubuntu主目录中不存在.bash_profile
。
最后,你不应该把别名放在.profile
中,.bash_profile
也不应该像geirha rightly says那样放在它们的好地方。这是因为您希望别名在交互式shell中工作,无论它们是否是登录shell。相反,在.bashrc
或更好的.bash_aliases
(如guest boeroe points out)中定义您的别名,默认.bashrc
来源。请参阅我如何创建一个永久的Bash别名?
默认的.profile
文件将检查您是否正在运行.bash
shell并且如果您是以下情况,请检查源.bashrc
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
同时,如果默认.bashrc
在non-interactive shell中运行,它将在顶部退出而不执行任何操作,因此如果它在non-interactive登录shell和其他更加模糊的场景中由.profile
获取,则其中的命令将不会运行2:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
因此,如果您将别名放在.bashrc
或.bash_aliases
中,您将获得它们用于交互式登录shell(使用.profile
)以及交互式non-login shell(使用.bashrc
)。这就是你想要的。只是不要把任何东西放在交互性检查之上,除非你真的,真的知道你在做什么。
1这个答案最初是为a WSL-related question编写的,但是这个问题已经作为副本关闭了,这个答案也完全适用于此,所以我扩展了一下并在此处发布了它。
2当bash
检测到它可能作为非登录shell的远程登录的初始shell运行时(例如,当您使用ssh
在远程计算机上运行单个命令时),它会运行来自.bashrc
的命令。 (参见GNU Bash manual中的6.2 Bash Startup Files。)
参考资料