perl - Linux上的磁盘名称

And*_*rew 1 perl

您建议在Linux上获取磁盘名称的模块是什么?我已经对CPAN进行了一些搜索,但我找到的所有模块都太旧了.在Bash我可以使用类似的东西:

disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3)
echo $disk_name
sda6
Run Code Online (Sandbox Code Playgroud)

请帮我理解如何在Perl中做同样的事情.谢谢.

Ilm*_*nen 5

在Linux上列出已安装磁盘的"正确"方法是通过getmntent()系统调用,可以使用Quota模块从Perl访问:

use Quota;

Quota::setmntent();
while (my ($dev, $path, $type, $opts) = Quota::getmntent()) {
    print "The root device is $dev.\n"  if $path eq "/";
}
Quota::endmntent();
Run Code Online (Sandbox Code Playgroud)

作为奖励,使用Quota模块列出设备挂载点应该是相当可移植到其他Unixish系统,解析各种系统文件或输出df可能不是.遗憾的是,这个看似基本的模块不包含在标准Perl发行版中,因此您必须从CPAN(或从您的发行版的软件包库中获取它 - 例如,Debian/Ubuntu具有libquota-perl软件包).


PS.简单地分割设备名称/和采取的第三个元素(如您的cut命令一样)是转,也就是说,一个安全的方式/dev/sdb1进入sdb1.它的一些问题是:

  1. 并非所有的块设备必须存在/dev- 它只是一个惯例.
  2. 即使设备文件/dev,它可能是在它的子目录.例如,我的根文件系统在设备上/dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0f.
  3. 有时,设备名称可能甚至不是实际的文件系统路径:例如,虚拟或内存中的文件系统(例如tmpfs通常使用设备名称安装)none,但可以使用任何设备名称.

如果你想摆脱这个/dev/部分,我建议使用正则表达式的保守方法,例如:

if ($dev =~ m(^/dev/(.*)$)s) {
    print "The directory $path is mounted from device $1 under /dev.\n";
} else {
    print "The directory $path is not mounted from a device under /dev.\n"
}
Run Code Online (Sandbox Code Playgroud)