/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin之间的区别在于它们所存放的程序文件的用途和访问权限。 首先,/bin目录是用来存放系统启动和运行所需的基本命令和工具的。这些命令通常是可被所有用户执行的,且包含了操作系统所需的最基本的功能。 而/sbin目录则存放着一些只有超级用户(root)才能执行的系统管理命令。这些命令往往需要特定的权限或者对系统进行深入的修改和配置。 与之相对应,/usr/bin目录中的程序文件是由系统管理员安装的软件包提供的。这些程序通常不是系统启动和运行所必需的,而是为了满足用户的需求而安装的额外工具。 类似地,/usr/sbin目录存放着只有超级用户可以执行的系统管理命令,但这些命令是由第三方软件包提供的,而非操作系统自带的。 另外,/usr/local/bin和/usr/local/sbin目录则用来存放局部安装的软件包所提供的命令和工具。这些软件包通常是用户自己安装的,并不隶属于操作系统的默认安装。 总结起来,这些目录在功能和访问权限上存在一些差异,通过正确的使用它们可以更好地管理和组织系统中的命令和工具。

我有六个目录,里面有命令文件。它们分别是/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin和/usr/local/sbin。
这些目录之间有什么区别?如果我要编写自己的脚本,应该将它们添加到哪个目录中?

相关内容:


2相关问题:https://unix.stackexchange.com/questions/8656/usr-bin-vs-usr-local-bin-on-linux/8658 - Gabriel Staples
1@Keelan 你的问题与我一年多前发布的一个问题非常相似:https://askubuntu.com/questions/830074/best-directory-to-place-my-bash-scripts - WinEunuuchs2Unix
2根据systemd和XDG,您自己的脚本应放在~/.local/bin目录中。更多信息请参考这里这里的答案。 - Matthias Braun
2个回答

请参考Linux的文件系统层次标准(FHS)
  • /bin:用于在挂载/usr分区之前可用的二进制文件。这些用于非常早期的引导阶段或需要在单用户模式下引导时可用的简单二进制文件。比如catls等。

  • /sbin:同上,但要求具有超级用户(root)权限的二进制文件。

  • /usr/bin:同上,但用于一般的系统范围内的二进制文件。

  • /usr/sbin:同上,但要求具有超级用户(root)权限的二进制文件。


如果我要编写自己的脚本,应该把它们放在哪里?
以上都不对。你应该将系统范围可用的脚本放在/usr/local/bin或/usr/local/sbin中。local路径意味着它不受系统软件包管理(这对于Debian/Ubuntu软件包来说是一个错误)。
对于用户范围的脚本,请使用~/bin(位于您的主目录下的个人bin文件夹)。
FHS规定了/usr/local的用途:
本地数据的三级层次结构,特定于此主机。通常还有进一步的子目录,例如bin/、lib/、share/。

所以/bin是安装所有核心文件的地方。像ls、cat、pwd等?那么,/usr/bin是用户安装应用程序的地方?/usr/bin中应该包含哪些示例? - Patoshi パトシ
2将脚本放置在/bin目录下是否会引起任何问题?我已按照您的回答移动了我的脚本,但我仍然好奇。 - Rumesh
9@RumeshSudhaharan,你不应该这样做,因为它是由软件包管理系统管理的。如果其他软件包也想使用该路径,它将覆盖你的文件。软件包中的文件永远不会重叠(至少对于官方仓库来说),所以当你安装在本地路径时更加安全。此外,这只是为了你自己的方便和安全起见。在本地路径上,你无法以如此糟糕的方式搞乱系统,也无法意外替换系统二进制文件。 - gertvdijk
13我喜欢错误页面上的解释:“严重程度:严重 确定性:确定” - cutrightjm
2我把一些文件放在了/usr/local/bin目录下,我可以执行它们,但是无法编辑。使用ls -la命令显示为空。 - M. Reza Nasirloo
4就我所知,sbin脚本无关。它存储二进制文件 - 即使提供的链接也指出了这一点。 - user260281
1@M.RezaNasirloo 你应该尝试使用 sudols。可能是权限问题。 - Carolus
1为了将用户范围的脚本放在~/bin目录中,您需要将路径~/bin包含在$PATH变量中。请参考https://askubuntu.com/a/195658/1044515。 - NAND
1正如@MatthiasBraun在对原问题的评论中指出的那样,用户范围的脚本应该放在~/.local/bin目录下。并且,正如@NAND所指出的那样,还应将其添加到$PATH中。 - Bob Stein

我自己一年多前也有一个类似的问题:最佳目录放置我的bash脚本? 系统二进制文件的目录 man hier(层次结构)列出了所有的目录。要获取仅用于二进制文件的目录,请使用:
$ man hier | grep -E 'bin$|sbin$|^.{7}(/bin)|^.{7}(/sbin)' -A2

       /bin   This directory contains executable programs which are needed in single user
              mode and to bring the system up or repair it.

--
       /sbin  Like  /bin,  this  directory  holds commands needed to boot the system, but
              which are usually not executed by normal users.

--
       /usr/X11R6/bin
              Binaries  which  belong  to the X-Window system; often, there is a symbolic
              link from the more traditional /usr/bin/X11 to here.
--
       /usr/bin
              This  is the primary directory for executable programs.  Most programs exe‐
              cuted by normal users which are not needed for booting or for repairing the
--
       /usr/local/bin
              Binaries for programs local to the site.

--
       /usr/local/sbin
              Locally installed programs for system administration.

--
       /usr/sbin
              This directory contains program binaries for  system  administration  which
              are  not  essential  for the boot process, for mounting /usr, or for system

将你自己的脚本放在哪里?

为了让所有用户都能访问你的脚本,你可以把它们放在/usr/local/bin目录中。请记住,你需要具备sudo访问权限才能在这里添加或更改文件。参见:是否有一个标准的位置用于放置自定义的Linux脚本?

对于你自己的用户ID脚本,请将它们放在/home/YOUR_NAME/bin目录中。请记住,你必须先创建此目录,并重新启动终端以使路径自动设置为~/.profile。参见:如何将/home/username/bin添加到$PATH?


我知道的我不知道

我正在考虑将一些我在Ask Ubuntu上的更复杂的bash脚本与github上的安装脚本结合起来。以下是一些示例:

我认为脚本应该安装在$PATH中的/usr/bin目录下,但是我还不确定适当的位置。

1我很感激你的努力,但是除了"我知道我不知道"这部分外,你复述了gertvdijk的回答。 - danzel
2我认为关键部分是man hier部分,gertvdijk的回答没有涉及。也就是说,你可以在命令行中获取目录层次结构,而不必求助于在网上(比如这里)阅读它。 - WinEunuuchs2Unix
1这是有趣的信息,我同意。但是gertvdijk已经提到了文件系统层次结构标准(man hier只是我个人认为信息不足的摘录)。然而,这可能是我的个人观点。 - danzel
1@danzel 我同意网站上的分析比我们硬盘上的更深入。我只是想指出信息在我们的硬盘上,而不必依赖互联网。此外,引用的维基百科链接缺少/usr/X11R6/bin/usr/local/bin,这些在man heir中是包含的。 - WinEunuuchs2Unix
@WinEunuuchs2Unix,在最后一段中,为什么不使用/usr/local/bin,因为您不是软件包管理器? - Pacerier
奇怪的是,apt-getadd-apt-repository这两个命令在/usr/bin/目录下,而不是/usr/sbin目录下,尽管它们主要用于系统管理。嗯,apt-get也可以用来显示更改日志,这并不需要超级用户权限。 - jarno