我发现空格在 ZFS 命令中似乎很重要,但仅在某些情况下才如此。例如,以下两个命令均有效:
root@grandidier:~# zfs list -t snap -r tank/srv
NAME USED AVAIL REFER MOUNTPOINT
tank/srv@initial 4.22G - 2.45T -
tank/srv@2018-01-09 106G - 3.40T -
tank/srv@2018-01-14 50.0M - 3.27T -
tank/srv@2018-01-17 48.8M - 3.16T -
tank/srv@2018-01-19 56.9M - 3.09T -
tank/srv@2018-01-30 48.6M - 2.72T -
tank/srv@2018-02-12 104M - 2.49T -
root@grandidier:~# zfs list -t snap -r tank/srv
NAME USED AVAIL REFER MOUNTPOINT
tank/srv@initial 4.22G - 2.45T -
tank/srv@2018-01-09 106G - 3.40T -
tank/srv@2018-01-14 50.0M - 3.27T -
tank/srv@2018-01-17 48.8M - 3.16T -
tank/srv@2018-01-19 56.9M - 3.09T -
tank/srv@2018-01-30 48.6M - 2.72T -
tank/srv@2018-02-12 104M - 2.49T -
root@grandidier:~#
(注意:在“...snap -r”之间添加了空格)但是,如果我将命令放在管道中并使用反引号替换来获取命令的结果,我会得到:
root@grandidier:~# export NEW=`zfs list -t snap -r tank/srv | tail -1 | awk '{print $1}'`; echo $NEW
tank/srv@2018-02-12
root@grandidier:~# export NEW=`zfs list -t snap -r tank/srv | tail -1 | awk '{print $1}'`; echo $NEW
cannot open ' -r': invalid dataset name
cannot open 'tank/srv': operation not applicable to datasets of this type
root@grandidier:~#
我觉得这很令人困惑和不安。我认为我可以通过编写没有任何额外空白的脚本来避开这个问题,但我真的很想知道为什么会发生这种情况。
这是
Ubuntu 16.04 LTS(最新)
bash 4.3.48
ZFS 0.6.5.11-1ubuntu3
编辑:回答前三条评论(并保留代码格式)
root@grandidier:~/bin# printf '%q\n' "$IFS"
$' \t\n'
看来 $(...) 语法也存在这个问题(见下一条评论)。
我不确定看起来像空格的东西可能来自哪里,但似乎这就是问题所在。我已将此字符串复制到/从 Google 文档复制,也许它对空格进行了某种翻译。如果我在 Google 文档中添加额外的空格并复制/粘贴到 xterm,则会报告错误。如果我编辑命令(在命令行上)并删除/重新输入两个空格,则命令可以正常工作而不会出错。
显然,Google Docs 不是一个好的编程编辑器。(我实际上并不是这样使用它,而是在处理某些事情时做笔记并保存命令副本。我可能应该坚持使用 vim 之类的东西。)