2016-04-20 33 views
1

今天我絆倒在的zsh 5.1.1(簡化的例子)以下問題:Zsh:具有空列表的zargs的行爲 - 這是一個錯誤還是一個特性?

#!/bin/zsh 
autoload -U zargs 
zargs -- my*files(N) -- rm -v 

這工作得很好,直到有一天,有沒有匹配我的病毒碼文件。因爲(N)的,命令變成

zargs -- -- rm -v 

我所預料的,在這種情況下rm不會在所有被調用,以類似的徒勞,其中xargs不調用命令,如果開關輸入是空的。然而,rm調用一次,沒有參數,然後有一個錯誤消息被寫入的效果。

事實上,我們可以看到,

zargs -- -- echo xxx 

還援引echo一次。

手冊頁中zargs的文檔在這方面並不十分清楚,但我認爲沒有參數,根本不應調用該命令。

我們有一個錯誤,或者是zargs真的應該以這種方式工作嗎?

回答

1

zargs今天以這種方式工作與GNU xargs類似(呃...)。

我們可以使用-r, --no-run-if-empty選項。 zargs繼承該物業由GNU xargs,從zargs --help

-r, --no-run-if-empty  if there are no arguments, then do not run COMMAND; 
          if this option is not given, COMMAND will be 
          run at least once 

GNU xargs有這個功能

-r,--no-運行,如果空
如果標準輸入不包含任何nonblanks,請不要運行 命令。通常,即使沒有輸入,該命令也會運行一次。 這個選項是一個GNU擴展。
- xargs.1 nroff source

(?UN)幸運的是,FreeBSD和NetBSD's有這樣的計數器功能:

-r
與GNU xargs的兼容性。 xargs的GNU版本至少運行一次 實用程序參數,即使xargs輸入爲空,並且它支持用於禁止此行爲的-r選項。 xargs的FreeBSD 版本不會在空的 輸入上運行實用程序參數,但它支持使用GNU xargs進行命令行兼容的-r選項 ,但-r選項在xargs的FreeBSD 版本中不做任何操作。
- FreeBSD xargs(1)

相關問題