xargs无法使用replstr(replace-string)

时间:2015-11-13 16:07:16

标签: linux bash xargs

这是命令:

... | xargs -I arguu bash -c "bq load --replace --source_format=CSV -F\"\t\" --quote \"\" big-data-alpha:psql.arguu arguu.csv `cat arguu.header`"

但是它告诉我'arguu.header没有这样的文件或目录',看起来像是争论不会被它取代。

有人能给我一些想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这里的问题是正在执行cat命令。

评估内部双引号反引号。因此,当shell在最后看到带有xargs的管道时,它会看到双引号字符串并扫描它以查找变量,命令替换(反引号和更现代的$()格式)等,并立即执行它们

所以之前关于你的管道的任何事情发生了(可能在技术上不准确,因为这可能被管道段细分但对当前的解释足够好)cat命令(带{{执行命令中的1}}。

因此错误。

arguu的参数上使用$''引用的原因是因为在单引号内(甚至是ANSI单引号bash -c)变量,命令替换等,请执行 not 发生。所以反引号会一直运行到$'' - 运行xargs,它会被替换并运行得恰到好处。

使用正常的单引号(不是ANSI引号)是正确的答案(因为您不希望主要shell扩展字符串中的任何内容)。

这也意味着你不再需要在字符串参数中转义双引号。

然而,这整个方法都是误导和不正确的。

从解析bash的输出开始。

错误的开始直接导致此处需要ls以及与之相关的问题。

这里的目标似乎是通过命令xargs命令处理当前目录中与production*.csv glob匹配的每个文件。

从一个glob和一个循环开始,从解析bq load --replace --source_format=CSV --allow_quoted_newlines --skip_leading_rows 1 big-data-alpha:psql.$globbed $file $first_line_of_file开始,这可以更容易地完成

即:

ls

我已经替换了for file in production*.csv; do stem=${file#production} # Strip "production" from the start of the filename. stem=${stem%.csv} # Strip ".csv" from the end of the filename. IFS= read firstline <"$file" echo "Processing $stem" bq load --replace --source_format=CSV --allow_quoted_newlines --skip_leading_rows 1 big-data-alpha:psql."$stem" "$file" "$firstline" done cathead的(相对)昂贵的子shell和外部命令调用,并且正在使用read,但是&{1}} #39;不是绝对必要的。

答案 1 :(得分:0)

问题在于命令引用和括号。在shell中调用时引用命令(不是命令运行的shell)。

将“字符更改为'字符。