1

Я хотел бы получить вывод из двух команд -

zpool list
zfs list

и для каждого найденного пула:

zpool get all nameofpool

и для каждой найденной файловой системы:

zfs get all nameoffilesystem

Фон и окружающая среда

Я делаю локальные изменения в сценарии, который является неотъемлемой частью OS X,

/usr/bin/sysdiagnose

  • #!/bin/sh для начинающих
  • всегда работать с привилегиями суперпользователя
  • иногда фактически безголовый (вызванный аккордом клавиш), поэтому на выходе должен быть файл.

Первый эксперимент

На основе примера в № 65 Удалите все снимки ZFS:

#!/bin/sh
for dataset in `zfs list -H | cut -f 1`
do
  zfs get all $dataset
done

Это работает, но не там, где в имени набора данных есть пробел. Например, если файловая система является zhandy/Pocket Time Machine выходные данные включают в себя:

cannot open 'zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine': dataset does not exist

 Второй эксперимент

... был основан на первом ответе на этот вопрос - с использованием IFS - и сделал сценарий более похожим на Apple. Смотрите редакцию 4.

Третий эксперимент

На основании принятого ответа на этот вопрос - с использованием IFS и кавычек для "$dataset":

#!/bin/sh
data_directory_path=~/Desktop
ECHO=/bin/echo
ZFS=/usr/sbin/zfs
ZPOOL=/usr/sbin/zpool
# If there exists a zfs binary, get some ZFS information
if [ -f "${ZFS}" ]
then
    "${ECHO}" "Recording ZFS pool version information ..."
    "${ZPOOL}" upgrade &> ${data_directory_path}/zpool\ upgrade.txt
    "${ECHO}" "    listing all ZFS pools ..."
    "${ZPOOL}" list &> ${data_directory_path}/zpool\ list.txt
    "${ECHO}" "    detailed health status and verbose data error information ..."
    "${ZPOOL}" status -v &> ${data_directory_path}/zpool\ status.txt
    "${ECHO}" "    pools that are available but not currently imported"
    "${ZPOOL}" import &> ${data_directory_path}/zpool\ import.txt
    "${ECHO}" "Recording ZFS file system version information ..."
    "${ZFS}" upgrade &> ${data_directory_path}/zfs\ upgrade.txt
    "${ECHO}" "    listing all ZFS file systems ..."
    "${ZFS}" list &> ${data_directory_path}/zfs\ list.txt
    "${ECHO}" "    all properties of each file system"
    OLD_IFS=$IFS
    IFS=$'\n'
    for dataset in `zfs list -H | cut -f 1`
    do
        "${ZFS}" get all "$dataset" &> ${data_directory_path}/ZFS\ file\ system\ properties.txt
    done
    IFS=$OLD_IFS
    "${ECHO}" "Listing the contents of /dev/dsk"
    "${LS}" -@adel /Volumes &> ${data_directory_path}/ls-dev-dsk.txt
    "${ECHO}" "Listing the contents of /var/zfs/dsk"
    "${LS}" -@adel /Volumes &> ${data_directory_path}/ls-var-zfs-dsk.txt
fi

Среди полученных файлов в ZFS file system properties.txt перечислены свойства только для одной файловой системы ZFS… набора данных с пробелом в имени.

Наиболее желательный конечный результат - это свойства:

  • для всех файловых систем ZFS
  • в файле.

Удаление следующей строки -

&> ${data_directory_path}/ZFS\ file\ system\ properties.txt

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


Критерий вывода в файл , которого не было в моем первом издании вопроса, можно легко найти в другом месте.

1 ответ1

2

Не расщепляется на пространствах

Баш for цикла разбивает аргумент на все пробельные символы по умолчанию. Вы можете как-нибудь избежать каждой строки - или просто переключиться на другой символ разделителя. cut будет возвращать одно значение на строку, поэтому между ними можно выбрать новую строку.

Следите за двойными кавычками в zfs get all , поэтому каждый $dataset также не разделяется.

#!/bin/bash
IFS=$'\n'
for dataset in `zfs list -H | cut -f 1`
do
  zfs get all "$dataset"
done

Сброс IFS

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

OLD_IFS=$IFS
# the whitespaces-sensitive lines
IFS=$OLD_IFS

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .