В ответ на вопрос я спросил относительно Так, Дайте точку монтирования пути, один респондент предложил использовать stat
связать имя устройства с объемом данного пути. Это работает приятно над Linux, но дает сумасшедшие результаты на Mac OS X 10.4. Для моей системы, df и монтируются, дайте:
cas cas$ df
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/disk0s3 58342896 49924456 7906440 86% /
devfs 194 194 0 100% /dev
fdesc 2 2 0 100% /dev
<volfs> 1024 1024 0 100% /.vol
automount -nsl [166] 0 0 0 100% /Network
automount -fstab [170] 0 0 0 100% /automount/Servers
automount -static [170] 0 0 0 100% /automount/static
/dev/disk2s1 163577856 23225520 140352336 14% /Volumes/Snapshot
/dev/disk2s2 409404102 5745938 383187960 1% /Volumes/Sparse
cas cas$ mount
/dev/disk0s3 on / (local, journaled)
devfs on /dev (local)
fdesc on /dev (union)
<volfs> on /.vol
automount -nsl [166] on /Network (automounted)
automount -fstab [170] on /automount/Servers (automounted)
automount -static [170] on /automount/static (automounted)
/dev/disk2s1 on /Volumes/Snapshot (local, nodev, nosuid, journaled)
/dev/disk2s2 on /Volumes/Sparse (asynchronous, local, nodev, nosuid)
Попытка получить устройства от точек монтирования, хотя:
cas cas$ df | grep -e/
| awk '{print $NF}'
| while read line; do echo $line $(stat -f"%Sdr" $line); done
/ disk0s3r
/dev ???r
/dev ???r
/.vol ???r
/Network ???r
/automount/Servers ???r
/automount/static ???r
/Volumes/Snapshot disk2s1r
/Volumes/Sparse disk2s2r
Здесь, я подаю каждую из точек монтирования, очищенных от df до статистики, производя результаты "%Sdr" строки формата, которая, как предполагается, является именем устройства: статистика Cf. (1) страница справочника:
The special output specifier S may be used to indicate that the output, if applicable, should be in string format. May be used in combination with: ... dr Display actual device name.
Что продолжается? Действительно ли это - ошибка в статистике или некоторый Darwin странность VFS?
Постскриптум На Andrew McGregor, попытайтесь передать "%Sd" статистике для большей странности. Это перечисляет некоторое по-видимому произвольное подмножество файлов от CWD...
Во-первых, как формат статистики, "%Sdr" интерпретируется как d
полевой селектор, измененный S
спецификатор, сопровождаемый литеральным строчным символом R.
Страница справочника, вероятно, была бы более четкой, если бы она сказала "d, r" вместо "доктора" в соответствии с описанием S
. d
и r
оба отдельные полевые селекторы. r
выбирает номер устройства из статистики (2) информация (т.е. st_rdev; только полезный при утверждении записей устройства (т.е. записи под/dev)). d
выбирает номер устройства устройства, которое содержит установленную запись (т.е. st_dev). Число, которое это печатает, является комбинацией главных и незначительных чисел, показанных ls (главный <<24 | незначительный).
S
модификатор, который может быть применен к обоим d
, r
, и несколько других полевых селекторов. При применении к d
или r
, это пытается распечатать название устройства вместо его необработанного числа. Некоторые устройства, как устройства виртуальной файловой системы, не имеют имен собственных, таким образом, это печатает ???
вместо этого (могло бы быть более хорошо, если бы это распечатало <major>,<minor>
вместо этого). Это не означает, что эти файловые системы не имеют устройств, просто что их устройства не имеют нормальных имен как "disk0s3".
“Странность оболочки” (“по-видимому произвольное подмножество файлов от CWD”) происходит из-за отсутствия заключения в кавычки. Оболочка видит (неупомянутый) "???" закончитесь и разворачивает его как шаблон шарика. Если cwd содержит какие-либо записи точно с тремя байтами (символы, в зависимости от локали?), оболочка заменит теми записями шаблон шарика. Поведение (заключение в кавычки и расширение шарика) варьируется оболочкой и может обычно изменяться различными опциями оболочки.
Можно изменить исходную команду как это для предотвращения globbing и запаздывания "r":
df | grep -e/ | awk '{print $NF}' | while read line; do echo "$line" "$(stat -f%Sd "$line"); done
Но я, вероятно, записал бы это как это вместо этого:
df | tail +2 | awk '{print $NF}' | xargs stat -f'%N %Sd %d'
С тем выводом (имя, номер устройства, имя устройства), можно, возможно, получить лучшее представление о том, что продолжается.
Или, возможно, требуется видеть, главные и незначительные числа, кроме того, чисел неструктурированного устройства (сравните их с тем, что Вы видите в (например). ls -l /dev/disk0s3
):
df | tail +2 | awk '{print $NF}' | xargs stat -f'%N %Sd %d' |
awk 'BEGIN{f=2^24} {$(NF+1) = int($NF/f) "," ($NF%f) } 1'
Вот маленькая программа C, которая может заменить проблематичное "df | голова | awk" конвейер.
Конечно, такая программа C могла сделать остальных сама работа, но могло бы быть хорошо иметь автономную программу, которая может просто выложить завершенные точки монтирования NUL.
mountz | xargs -0 stat -f'%N %Sd %d' |
awk 'BEGIN{f=2^24} {$(NF+1) = int($NF/f) "," ($NF%f) } 1'
Код:
#include <sys/mount.h>
#include <stdio.h>
#include <stdlib.h>
/* usage: mountz | xargs -0 command_for_each_mount_point */
int main(int argc, const char *argv[]) {
struct statfs *buf;
int flags = MNT_NOWAIT, num_fs, num_stat, i;
unsigned bufsz;
num_fs = getfsstat(NULL, 0, flags);
if (num_fs < 0) {
perror("unable to count mounted filesystems: getfsstat");
exit(1);
}
bufsz = sizeof(*buf) * num_fs;
buf = malloc(bufsz);
if (!buf) {
perror("unable to allocate %u statfs structs");
exit(1);
}
fprintf(stderr, "p=%p\n", buf);
num_stat = getfsstat(buf, bufsz, flags);
if (num_stat < 0) {
perror("unable to getfsstat");
exit(1);
}
if (num_stat != num_fs) {
fprintf(stderr, "Hmm, expected %u, got %d.\n", num_fs, num_stat);
}
for (i = 0; i < num_stat; i++) {
fprintf(stdout, "%s%c", buf[i].f_mntonname, 0);
}
}
Таким образом, виртуальные файловые системы не имеют устройств - я не попробовал его за те файловые системы. Это не проблема для Сети/,/automount/Servers или/automount/static, поскольку они не должны содержать файлы. Но/dev интересен.
df | grep -e/ | awk '{print $NF}' | while read line; do echo $line $(stat -f"%Sd" $line); done
/ disk0s2
/dev XGS bin tmp
/net XGS bin tmp
/home XGS bin tmp
Я сказал бы, Darwin странность VFS.