Как я разделяю переменную за 0$ для нахождения путей к каталогам и относительных путей в ударе?

ZFS не находится в официальном ядре Linux и никогда не будет, если Oracle не повторно лицензирует код под чем-то совместимым с GPL.

Эта несовместимость оспаривается. Основные аргументы в пользу ZFS, позволяемого в системах Linux, вращают вокруг длины так называемой "руки" правило. То правило применяется в этом случае, только если ZFS обеспечивается как отдельный модуль от ядра, эти два связываются только через опубликованные API, и обе кодовых базы могут функционировать друг независимо от друга. Требование затем состоит в том, что лицензия никакой кодовой базы не заражает другой, потому что ни один не полученная работа другого; они независимы, но сотрудничают. Тем не менее, даже при этой интерпретации, это означает, что модули ZFS должны все еще быть поставлены отдельно от ядра Linux, которое является, как мы видим, что он обеспечивается сегодня Ubuntu.

Вполне отдельно от CDDL по сравнению с аргументом GPL, NetApp утверждает, что они владеют патентами на некоторой технологии, используемой в ZFS. NetApp уладил их судебный процесс с Sun после выкупа Oracle, но то урегулирование не защищает никакого другого дистрибьютора Linux. (Red Hat, Ubuntu, SuSE...)

Поскольку я вижу его, это Ваши альтернативы:

  • Используйте btrfs вместо этого, поскольку он имеет подобные функции к ZFS, но не имеет конфликта лицензии GPL и был в ядре магистрали для тестирования с тех пор 2.6.29 (выпущен в январе 2009).

    Основная проблема с btrfs состоит в том, что он имел долгую историю проблем с ее RAID 5/6 функциональность. Эти проблемы разрабатываются, но каждый раз одна из этих проблемных поверхностей, это сбрасывает "часы устойчивости".

    Другое беспокойство - то, что Red Hat указал, что следующий выпуск Red Hat Enterprise Linux не будет включать btrfs.

  • Одна из причин, Red Hat занимает ту позицию на btrfs, - то, что у них есть план предложить схожую функциональность с помощью другого технологического стека, который они называют Stratis. Поэтому другая опция, которую Вы имеете, состоит в том, чтобы ожидать Stratis, чтобы появиться, с 1,0 запланированными на первую половину 2018, по-видимому, совпасть с Red Hat Enterprise Linux 8.

  • Используйте другую ОС для своего файлового сервера (FreeBSD, скажите), и используйте NFS для соединения его с полями Linux

  • Используйте ZFS на FUSE, реализации пространства пользователя, которая работает аккуратно вокруг проблемы лицензирования ядра за счет существенного количества производительности

  • Интегрируйте ZFS на Linux после установки ОС.

    Конфликт лицензии делает распределение объединенной системы за пределами Вашей организации юридически сомнительным. Я не адвокат, но мой смысл состоит в том, что, доступные проблемы в стороне, распределяя ZFS на Linux являются почти столь же беспокоящими как распределяющий non-GPL двоичные драйверы (такие как те, которые для определенных видеокарт) с системой. Если одно из этих беспокойств Вы, другой должен, также.

  • Переключитесь на Ubuntu, которая поставляла модули ядра ZFS с ОС с тех пор 16.04. Канонический полагает, что юридически безопасно распределить модуль ядра ZFS с самой ОС. Необходимо было бы решить, доверяете ли Вы мнению Canonical; полагайте также, что они не могут быть готовы возместить Вас, если юридический вопрос подходит.

    Остерегайтесь этого, не в настоящее время возможно загрузиться от ZFS с Ubuntu без большого ручного хакерства.

Кстати, btrfs также поддерживается Oracle, но был запущенными годами перед приобретением Sun. Я не полагаю, что эти два будут когда-либо объединяться, или один быть удержанными от использования в пользу другое должное к конфликту лицензии и доступной проблеме. ZFS слишком популярен, чтобы уйти, но туда продолжит быть спросом на альтернативу ZFS.

10
22.05.2011, 21:39
3 ответа

Вы не должны обрабатывать вещи как ~, оболочка делает это для Вас. Вот почему можно передать ~/filename к любому сценарию или программа и это работают - все те программы не обрабатывают ~ самостоятельно, Ваша оболочка преобразовывает аргумент /home/username/filename и передачи, что к программе вместо этого:

$ echo ~/filename
/home/mrozekma/filename

Если Вам нужно каноническое имя файла (тот, который не включает вещи как ..), используйте realpath (спасибо Neil):

$ realpath ~/../filename
/home/filename

Что касается разделения пути к имени каталога и имени файла, использовать dirname и basename:

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz
17
27.01.2020, 20:00
  • 1
    я думаю, что Вы имеете в виду realpath, не readlink. readlink, не будет работать в общей ситуации, т.е. когда ссылка будет использовать относительный путь, и Вы не находитесь в том же dir как ссылка. –  Neil Mayhew 11.09.2010, 02:03
  • 2
    @Neil realpath лучше, но readlink кажется, работает, когда я пробую его; Вы знаете о примере, где он перестал работать? –  Michael Mrozek♦ 11.09.2010, 11:44
  • 3
    cd /tmp; touch foo; ln -s foo bar; cd; readlink /tmp/bar. Это возвращается foo и realpath возвраты /tmp/foo, который является тем, что Вы хотите. –  Neil Mayhew 12.09.2010, 02:47
  • 4
    @Neil, @Michael: readlink -f (примечание -f) почти эквивалентно realpath, и это более портативно: readlink -f в GNU coreutils и существует в нескольких других системах также; realpath упаковывается отдельно и может не быть установлен (например, только 5 not-that-common пакетов зависят от него в Ubuntu 10.04 или Debian lenny). –  Gilles 'SO- stop being evil' 13.11.2010, 13:33
  • 5
    @Gilles: положительная сторона. Спасибо за напоминание о realpath-f. –  Neil Mayhew 16.11.2010, 00:36

Используя dirname и базовое имя любят упомянутый Michael, должен быть самый безопасный способ получить то, что Вы хотите.

Так или иначе, если Вы действительно хотите сделать это с "ударом только инструменты", Вы могли бы использовать замену параметра:

echo `basename $PWD`        # Basename of current working directory.
echo "${PWD##*/}"           # Basename of current working directory.
echo
echo `basename $0`          # Name of script.
echo $0                     # Name of script.
echo "${0##*/}"             # Name of script.
echo
filename=test.data
echo "${filename##*.}"      # data
                            # Extension of filename.

Этот пример непосредственно взят из Усовершенствованного Руководства по созданию сценариев Bash, которое является достойное внимания.

Объяснение довольно просто:

$ {var#Pattern} Удаляют из $var самую короткую часть $Pattern, который соответствует фронтэнду $var. $ {var##Pattern} Удаляют из $var самую длинную часть $Pattern, который соответствует фронтэнду $var.

Посмотрите на шаблон как некоторый regex и # или ## как некоторый greedy/non-greedy модификатор.

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

5
27.01.2020, 20:00
  • 1
    Остерегается при использовании ${...##...} и друзья, а не dirname и basename то, что они не работают во всех случаях. Например, оба ${0##*/} и ${0%/*} расширьтесь до того же как $0 если $0 не содержит a /. –  Gilles 'SO- stop being evil' 08.09.2010, 01:11
  • 2
    @Gilles я понимаю почему ${0%/*} не хорошая альтернатива dirname. Однако что случилось с использованием ${0##*/} вместо basename? –  toxalot 16.03.2014, 11:24
  • 3
    @toxalot Для этого, единственная проблема состоит в том когда $0 имя каталога с запаздыванием /. Но я сожалею о своем совете, потому что dirname не делает немного лучше. –  Gilles 'SO- stop being evil' 16.03.2014, 16:18

realpath команда, которая говорит, Вы реальный путь (удаляет.. и символьные ссылки и т.д.)

Это стандартно с FreeBSD. Согласно этому обсуждению это также доступно для Linux:

http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html

То обсуждение также предлагает решение для удара:

$ bash -c "cd /foo/../bar/ ; pwd"
2
27.01.2020, 20:00
  • 1
    Точно, что-то вроде этого обычно работает: MYDIR =" $ ($ CD (dirname "0$"); pwd)" –  Kevin Cantu 09.09.2010, 01:33

Теги

Похожие вопросы