Вопрос старый, но я не мог найти лучшего решения, которое я здесь размещаю. Найти все USB-накопители, но не перечислять разделы, тем самым удалив «часть [0-9]» из результатов. Я закончил делать два grep, последний отрицает результат:
ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -vE "part[0-9]*$"
Это приводит к моей системе:
pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0
Если мне нужны только разделы, которые я мог бы сделать:
ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -E "part[0-9]*$"
Где я получаю:
pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part1
pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part2
И когда я это делаю:
readlink -f /dev/disk/by-path/pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0
Я получаю:
/dev/sdb
Абстрактные статические методы являются своего рода нечетным понятием. Статический метод в основном «жестко кодирует» метод для класса, убедившись, что существует только один экземпляр (~ singleton). Но сделать его абстрактным означает, что вы хотите заставить другой класс его реализовать.
Я вижу, что вы пытаетесь сделать, но когда вы занимаетесь абстрактными классами, я бы избегал статических методов в базовом классе. Вместо этого вы можете использовать позднюю статическую привязку (static: :) для вызова метода tableStruct в «дочернем» классе. Это не приводит к тому, что метод будет реализован как абстрактный, но вы можете протестировать реализацию и выбросить исключение, если оно не существует.
public static function foo(){
// call the method in the child class
$x = static::tableStruct();
}
Для чего это стоит ...
Нарушение интерфейсов:
interface Imodel {
static function tableStruct();
}
abstract class model implements Imodel {
private static $tableStruct = array();
public static function foo() {
if (!isset(self::$tableStruct[get_called_class()]))
self::$tableStruct[get_called_class()] = static::tableStruct();
// I'm using it here!!
}
}