Chr*_*s R 19 linux osx filesystems mount
我需要一种独立于平台的轻量级方法来检测我的 CWD 的安装类型。具体来说,我需要确定我的 CWD 是否在 SSHFS、NFS、CIFS、SMB 或本地块存储挂载中。
我需要在 Mac OSX 10.6、10.7 和 RHEL5(至少)上执行此操作。
有可能使用 df,但 df 在这两个平台上的表现截然不同。另外,我必须使用 awk 使用 CLI 刮取它的输出,虽然可行,但它……很脆弱。
此信息必须在某个级别上可用。是否有我不知道的工具可以向我提供这些信息?
Gil*_*il' 17
文件系统类型不是您可以以独立于操作系统的方式轻松访问的东西。文件系统类型名称依赖于操作系统,因此没有任何建立标准方法的动机。
在非嵌入式 Linux 系统上,stat -f -c %T .显示当前目录的文件系统类型。OSX 的stat命令没有这样的东西。
由于您只想知道文件系统类型是否在有限列表中,因此在 Linux 下,您可以限制打印信息的路径集和文件系统类型集。如果当前目录的文件系统类型不在列表中,您将收到错误(“df: no file systems processing”)。
if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …
Run Code Online (Sandbox Code Playgroud)
相同的语法在 OSX 上可能有效也可能无效;如果没有,请尝试df -T sshfs,nfs,cifs .。
您可以在 Linux 上使用 GNU stat:
stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,从 util-linux 2.18 开始就可以使用 findmnt。
findmnt -n -o FSTYPE -T /home
nfs4
Run Code Online (Sandbox Code Playgroud)
尚未对其进行测试,但df -P在大多数平台上的行为应该相同。
这适用于 Linux。
$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '
Run Code Online (Sandbox Code Playgroud)
或者将其分解为可重用的函数:
# get_mount <directory>
get_mount() {
df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}
# get_fs <mountpoint>
get_fs() {
mount | grep "^$1 " | cut -f 5 -d ' '
}
Run Code Online (Sandbox Code Playgroud)
并调用该函数:
get_fs $(get_mount .)
Run Code Online (Sandbox Code Playgroud)
可以使用重写来稍微快一些sed可以使用orawk,但这种方式可能更容易阅读。
如果这不起作用,您可以尝试类似的方法,但使用/etc/mtab而不是 的输出mount。