0

df 命令显示已挂载或未挂载文件系统占用的磁盘空间量、已用和可用空间量,以及已使用文件系统总容量的多少。

Linux 在以下位置/bin中有 df 命令,而在 Solaris 中在以下位置/usr/gnu/bin ...

如果假设/usr/bin在 PATH 中设置,那么以编程方式,我需要确保调用所需的 df(如上所述)之一而不是用户定义的 df。

解决此问题的一种方法是使用 uname 获取操作系统并相应地设置 df ...在我不依赖操作系统的情况下,还有其他更好的方法可以做到这一点。

注意:默认的 df 和 gnu df 给出不同的输出,因此我需要以编程方式在两个不同的操作系统上调用所需的 df 命令(路径如上所述)

没有找到问题的任何解决方案 使用了我在问题本身中提供的替代解决方案!

4

5 回答 5

1

Solaris 上没有“默认”df。你有各种各样的df命令,每一个都是为了满足特定的需要而设计的。

  • /usr/bin/df是 Solaris 10 和更早版本安装中 root 和大多数用户默认使用的一种。这是所有系统脚本都使用的。

  • /usr/xpg4/bin/df是需要标准合规性的人和脚本使用的符合 POSIX 的版本。

  • /usr/gnu/bin/dfdf仅适用于 Solaris 11 和更新版本的 GNU 版本,它首先出现在非 root 用户默认 PATH 中,但不在 root 默认 PATH 中。

当然,用户可以自由更改他们的 PATH 以df首先出现特定的 to,甚至是此处未描述的自定义路径、函数、别名等等。

如果要编写不依赖于用户或系统自定义的可移植脚本,可以运行以下命令:

PATH=$(getconf PATH) df

如果要使用df具有自己扩展名的特定版本,例如GNU df,则需要将此命令所在的目录添加到 PATH 变量中。

于 2013-10-25T09:02:52.760 回答
0

每当您在任何 unix 变体中触发任何命令时,它都会检查您的 PATH 环境变量。它以 PATH 环境变量中提到的相同顺序检查每个目录中的命令。

因此,在您的 shell 脚本中,只需设置 PATH 变量,以便默认 df 路径将出现在开头,如下所示。

PATH = Defaut_df_path:$PATH  

无论操作系统是什么,如果您触发“df”,它将是您的默认“df”。

系统管理员解决方案 - 请在 .bashrc 文件(或 bash-profile)中执行此操作。下次df总是会触发默认df。

#!/usr/bin/sh
default_path='/usr/bin';
PATH=$default_path:$PATH;
echo $PATH;
df
which df  ## this will give you path which you are using

编程解决方案 - 如果您正在编写一些 shell 脚本,请在使用 df 之前执行此操作。它将为该特定运行设置。

我认为在大多数 linux 变体 df 默认位置是 /bin 或 /usr/bin。所以设置这些路径就足够了。您也可以检查 /bin/df 是否存在然后运行 ​​/bin/df 否则 /usr/bin/df 如下所示。

if [ -e /bin/df ]
then
/bin/df
else
/usr/bin/df
fi
于 2013-10-25T07:34:21.187 回答
0

目标系统是否在您的控制之下,这是否涉及一组有限的服务器?

如果是这样,如何在 Solaris 和 Linux 服务器中添加一个软链接,在相同的位置和相同的名称?

就像是:

  • 索拉里斯:ln -s /usr/gnu/bin/df /usr/bin/my_df

  • Linux:ln -s /bin/df /usr/bin/my_df

然后让你的脚本/usr/bin/my_df用于每个盒子。

不是花哨而且相当简单的方法......但也许它对你有用?

只是我的2c。

于 2013-10-28T16:09:59.907 回答
0

解决这个问题的唯一解决方案似乎是使用 uname 来获取操作系统并相应地设置 df ......与我在问题中所说的相同!!!

于 2013-11-07T09:04:43.913 回答
0

据我所知,您在 solaris 系统中有两个“df”变体。我的建议:在开始该过程之前修改环境变量。用 python 的 subprocess 接口来做这件事很容易。

解决方案 1

尝试调用platform.uname()并检查操作系统是solaris还是linux。我认为该调用返回一个关于操作系统的元组。

import subprocess, os , platform
if(os.platform()[0] == 'Solaris') 
     my_env = os.environ.copy()
     my_env["PATH"] = "/usr/bin:" + my_env["PATH"]
     subprocess.Popen(my_command, env=my_env)

subprocess.Popen(my_command, env=NONE)

解决方案 2

由于调用会逐一检查 PATH 中的每个条目,因此请将 [X](您喜欢的 df 的路径)添加到 PATH 中。如果它的 solaris 会被拾取,否则它会移动到 PATH 中的下一个条目。

于 2013-10-25T08:03:13.320 回答