Следующий, очень ненадежный код оболочки даст точку монтирования $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 для правильного выполнения работы.