3

我有一个这样的测试文件夹:

[20/01/3|2:08:12][samuel@localhost:/tmp]
>>> ls test1
1.txt  2.txt  3.txt  4.txt  5.txt

在普通的bash/zsh shell 中,这是命令的输出

>>> rsync -avz --exclude="2.txt" --dry-run test1/ test2/
sending incremental file list
./
1.txt
3.txt
4.txt
5.txt

sent 138 bytes  received 31 bytes  338.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
[20/01/3|2:10:42][samuel@localhost:/tmp]

但在xonsh shell 中,这是输出

samuel@localhost /tmp $ rsync -avz --exclude="2.txt" --dry-run test1/ test2/                                                            
sending incremental file list
./
1.txt
2.txt
3.txt
4.txt
5.txt

sent 156 bytes  received 34 bytes  380.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
samuel@localhost /tmp $

我也尝试用单个顶点进行更改,但结果是一样的。

谁能解释一下这个简单的命令哪里出错了??

我的 xonsh 版本是0.9.11,但我也用0.9.13进行测试

4

2 回答 2

4

在 xonsh 下运行时,没有类似于 shell 引用的处理。参数按原样传递给rsync程序。特别是,'--exclude="2.txt"' 将通过引号传递给 rsync。

要排除2.txt, 而不是"2.txt", 'xonsh' 的命令应该是:

rsync -avz --exclude=2.txt --dry-run test1/ test2/
于 2020-01-04T06:29:26.010 回答
2

简短的答案:

  • 删除等号即--exclude "2.txt"
  • 或删除引号即--exclude=2.txt
  • 或使用python替换即--exclude=@("2.txt")
  • 或在不更改命令的情况下运行宏调用,即bash -c! find ...

详细解答:

要了解差异,请尝试在 bash 和 xonsh 中跟踪命令。

重击:

set -x
rsync -avz --exclude="2.txt" --dry-run test1/ test2/
# + rsync -avz --exclude=2.txt --dry-run test1/ test2/

Xonsh:

$XONSH_TRACE_SUBPROC=True
rsync -avz --exclude="2.txt" --dry-run test1/ test2/
# (['rsync', '-avz', '--exclude="2.txt"', '--dry-run', 'test1/', 'test2/'],)

在这里您可以看到不同之处:bash 删除了参数的引号,因为引号在 bash 中具有特殊含义,但 xonsh 将它们保留在参数中。

要使其正常工作,您可以删除引号或使用 xonsh 中的 python 替换传递文件名:

rsync -avz --exclude=2.txt --dry-run test1/ test2/
rsync -avz --exclude=@("2.txt") --dry-run test1/ test2/

另一种方法是使用 xonsh宏命令并按原样运行 bash 行:

bash -c! rsync -avz --exclude="2.txt" --dry-run test1/ test2/

为了简化这种方法,有一个xontrib-sh扩展,它只允许! 在命令前添加符号:

! rsync -avz --exclude="2.txt" --dry-run test1/ test2/

还:

于 2020-10-18T13:57:26.290 回答