Дайте точку монтирования пути - PullRequest
13 голосов
/ 30 января 2010

Следующий, очень ненадежный код оболочки даст точку монтирования $path:

 (for i in $(df|cut -c 63-99); do case $path in $i*) echo $i;; esac; done) | tail -n 1

Есть ли лучший способ сделать это в оболочке?

Постскриптум

Этот скрипт действительно ужасен, но обладает таким качеством, что он работает на моих системах. Обратите внимание, что несколько точек монтирования могут иметь префиксы $path.

Примеры В системе Linux:

cas@txtproof:~$ path=/sys/block/hda1
cas@txtproof:~$ for i in $(df -a|cut -c 57-99); do case $path in $i*) echo $i;; esac; done| tail -1
/sys

В системе Mac OSX

cas local$ path=/dev/fd/0
cas local$ for i in $(df -a|cut -c 63-99); do case $path in $i*) echo $i;; esac; done| tail -1
/dev

Обратите внимание на необходимость изменения параметров среза из-за различий в выводе df; Использование awk решает эту проблему, но даже awk непереносим, ​​учитывая диапазон форматирования результатов различных реализаций возврата df.

Ответ Похоже, что табличный вывод - единственный путь в оболочке, но

df -P "$path"  | tail -1 | awk '{ print $NF}'

на основании ответа ghostdog74, это большое улучшение по сравнению с тем, что у меня было. Обратите внимание на две новые проблемы: во-первых, df $path настаивает на том, что $path называет существующий файл, сценарий, который у меня был выше, не заботится; во-вторых, не стоит беспокоиться о разыменовании символических ссылок. Это не работает, если у вас есть точки монтирования с пробелами в них, что происходит, если у вас есть съемный носитель с пробелами в именах томов.

Нетрудно написать код Python для правильного выполнения работы.

Ответы [ 11 ]

0 голосов
/ 30 января 2010
mount | grep "^$path" | awk '{print $3}'
...