混合python和bash shell的xargs命令疑惑

yan*_*nnn 4 python bash xargs

system : Centos 6.7 Lasted 
Shell : bash 
python : 2.6.6
Run Code Online (Sandbox Code Playgroud)

这让我非常困惑!示例如下:

5个文件:

a1111  a2222  b1111  b2222  t.py
Run Code Online (Sandbox Code Playgroud)

t.py内容:

import sys

if __name__ == '__main__':
    a1 = sys.argv[1]
    print 'id(a1)=%s, len(a1)=%s, str(a1)=%s, type(a1)=%s' % (id(a1), len(a1), str(a1), type(a1))
Run Code Online (Sandbox Code Playgroud)

这样做:

ls | xargs -I{} echo $(python t.py '{}')
Run Code Online (Sandbox Code Playgroud)

输出:

id(a1)=139821454683184, len(a1)=2, str(a1)=a1111, type(a1)=<type 'str'>
id(a1)=139821454683184, len(a1)=2, str(a1)=a2222, type(a1)=<type 'str'>
id(a1)=139821454683184, len(a1)=2, str(a1)=b1111, type(a1)=<type 'str'>
id(a1)=139821454683184, len(a1)=2, str(a1)=b2222, type(a1)=<type 'str'>
id(a1)=139821454683184, len(a1)=2, str(a1)=t.py, type(a1)=<type 'str'>
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么len(a1)= 2,但str(a1)= a1111 ?, 字符串长度显然不等于2,

没有回声是好的,但这不是我的问题.我使用xargs -p选项来打印cmd

ls | xargs -I{} python t.py '{}'
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 6

发生这种情况的原因是$(python t.py '{}')表达式在传递之前正在进行评估xargs.$(python t.py '{}')打印"ID(A1)= 139821454683184,LEN(A1)= 2,STR(A1)= {},类型(A1)=",所以被传递给xargs,它取代了{}与每个文件名...

这是一个shell跟踪,显示正在发生的事情:

$ set -x # turn on tracing
$ ls | xargs -I{} echo $(python t.py '{}')
+ ls
++ python t.py '{}'
+ xargs '-I{}' echo 'id(a1)=4560222208,' 'len(a1)=2,' 'str(a1)={},' 'type(a1)=<type' ''\''str'\''>'
id(a1)=4560222208, len(a1)=2, str(a1)=a1111, type(a1)=<type 'str'>
id(a1)=4560222208, len(a1)=2, str(a1)=a2222, type(a1)=<type 'str'>
id(a1)=4560222208, len(a1)=2, str(a1)=b1111, type(a1)=<type 'str'>
id(a1)=4560222208, len(a1)=2, str(a1)=b2222, type(a1)=<type 'str'>
id(a1)=4560222208, len(a1)=2, str(a1)=t.py, type(a1)=<type 'str'>
Run Code Online (Sandbox Code Playgroud)

"+"行显示shell实际执行的内容.(您可以忽略参数以xargs单引号显示;这只是因为输出t.py被拆分为单词,但其输出中的其他shell元字符被忽略,并且直接在命令行上获得相同的效果'' d必须引用(/ escape)参数.)

顺便说一下,还有另一个赠品,就是这就是正在发生的事情:每行的id是相同的,但如果t.py实际上每个行都是单独执行的,那么你会得到不同的ID.