【问题标题】:How can I get rid of bash: $1: ambiguous redirect on xargs command我怎样才能摆脱 bash: $1: ambiguous redirect on xargs 命令
【发布时间】:2016-07-29 03:41:18
【问题描述】:

我正在尝试在给定数据库上使用 sql setences 执行多个文件:

ls -lah | grep "sql$"  | awk '{print $9}' | xargs mysql -uanuser -papassword a_database < $1

但我得到了错误:

bash: $1: ambiguous redirect

如果我将 xargs 上的命令更改为简单的 echo $1,它就可以工作

我已经尝试过这样的双引号:xargs mysql -uanuser -papassword a_database &lt; "$1" 和这个"xargs mysql -uanuser -papassword a_database &lt; $1" 没有运气终端带来另一个错误:

xargs: mysql -uanuser -papassword a_database < {}: No such file or directory

你能帮帮我吗?

【问题讨论】:

  • ls -lah | grep "sql$" | awk '{打印 $9}' | xargs | mysql -uanuser -papassword a_database
  • 嗨@IndraUprade,它试过但给我这个错误:bash: $1: ambiguous redirect xargs: echo: terminated by signal 13
  • 另一个问题是xargs 已经从管道获取其标准输入,并且&lt; 应用xargs,而不是mysql。据我所知,不可能使用xargs 运行命令并从标准输入中读取。
  • 谢谢@chepner 我会尝试另一种方法问候。
  • 如果你仍然热衷于使用xargs,你可以find . -name \*.sql -print0 | xargs -n1 -I{} -0 bash -c "mysql -uanuser -papassword a_database &lt; '{}'"

标签: mysql bash


【解决方案1】:

您不需要使用ls -l | grep | awk,只需对*.sql 文件使用简单的for 循环即可:

for f in *.sql; do
   mysql -uanuser -papassword a_database < "$f"
done

【讨论】:

  • 是的,如果写在一行中,那么在done之前需要;
  • 这对我有用,谢谢它只需要在完成之前稍微更改分号for f in *.sql; do mysql -uanuser -papassword a_database &lt; "$f"; done
【解决方案2】:

这是 xargs 方法的工作原理:

ls -lha | grep "sql$" | awk '{print $9}' | xargs -t -n1 -I{} bash -c "mysql -uanuser -papassword a_database < '{}'"

【讨论】:

  • ls -lha | grep "sql$" | awk '{print $9}' 应替换为find . -type f -name "*.sql" -print0。并且-0 应该作为选项传递给xargs 以正确解析find 的输出。即使文件名包含空格、换行符、制表符......,这也会起作用
  • 感谢@alvits 在这个过程中我也发现了xargs-t 参数在执行它们之前打印命令结合-p 可以在执行它们之前检查命令是否正常,我学到了很多!
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 2021-01-27
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多