跨多个操作系统的df命令

时间:2013-10-25 07:26:43

标签: python linux solaris expect

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

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

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

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

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

没有找到解决问题的方法 使用我在问题中提供的替代解决方案!

5 个答案:

答案 0 :(得分:1)

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

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

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

  • /usr/gnu/bin/df是仅在Solaris 11及更高版本中可用的df的GNU版本,它首先出现在非root用户的默认PATH中,但不出现在root默认PATH上。

当然,用户可以自由更改其路径,以便首先显示特定的df,或者甚至是此处未描述的自定义路径,功能,别名等等。

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

PATH=$(getconf PATH) df

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

答案 1 :(得分:0)

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

所以在你的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 varient df默认位置是/ bin或/ usr / bin。所以设置这些路径就足够了。你也可以检查/ bin / df是否存在然后运行/ bin / df否则/ usr / bin / df如下所示。

if [ -e /bin/df ]
then
/bin/df
else
/usr/bin/df
fi

答案 2 :(得分:0)

从我可以收集到的内容中,你在solaris系统中有两个'df'变体。我的建议:在开始进程之前修改环境变量。使用python的子进程接口执行此操作非常简单。

解决方案1 ​​

尝试调用platform.uname()并检查os是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中的下一个条目。

答案 3 :(得分:0)

目标系统是否在某种程度上受您控制,这是否涉及一组有限的服务器?

如果是这样,那么在Solaris和Linux服务器上,在同一位置和同一名称添加软链接怎么样?

类似的东西:

  • Solaris:ln -s /usr/gnu/bin/df /usr/bin/my_df

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

然后让你的脚本为每个框使用/usr/bin/my_df

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

只是我的2c。

答案 4 :(得分:0)

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