我想获取两个命令的输出 –
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
不在空格处分割
bash 的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