用xargs命令使用docker exec运行`bash`

我一直试图执行运行docker集装箱具有特定名称,如下所示。 --(1)

 docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it '{}' 

但它不起作用,并显示一条消息

“docker执行”至less需要2个参数

当我尝试使用命令如下--(2)

 docker ps | grep somename | awk '{print $1 " bash"}' | xargs docker exec -it 

它显示了另一个错误消息

input设备不是TTY

但是,当我尝试使用$()(子shell),那么它可以完成,但我不明白为什么它不能与上面的两个代码(1)(2) (使用xargs)

有没有人能解释为什么会发生这种情况

我真的很感激你提前提供的任何帮助=)

编辑1:

我知道如何以其他方式完成我的目标

 docker exec -it $(docker ps | grep perf | awk '{print $1 " bash"}' ) 

但我只是好奇为什么这些代码不工作=)

  • 第一个问题

“docker执行”至less需要2个参数

在最后一个pipe命令中, xargs的标准input是例如42a9903486f2 bash 。 你用-I (replacestring)选项使用xargs 。 所以, 42a9903486f2 bash认识到42a9903486f2 bash是第一个参数,没有第二个参数。

下面的例子也许是你所期望的。

 docker ps | grep somename | awk '{print $1 " bash"}' | xargs bash -c 'docker exec -it $0 $1' 
  • 第二个问题

input设备不是TTY

xargs在新的subprocess中执行命令。 所以你需要重新打开stdin到subprocess进行交互式通信。 (MacOS:-o选项)

 docker ps | grep somename | awk '{print $1 " bash"}' | xargs -o docker exec -it 

你运行的exec命令是这样的:

 docker exec -it 'a1b2c3d4 bash' 

这只是一个参数,而不是两个。 您需要删除docker exec参数的引号。

 ... | xargs -I'{}' docker exec -it {} 

那么你会用两个参数正确地执行。

 docker exec -it a1b2c3d4 bash ------ --- first arg ^ ^ second arg