这是命令:
... | 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没有这样的文件或目录',看起来像是争论不会被它取代。
有人能给我一些想法吗?
非常感谢!
答案 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
中cat
和head
的(相对)昂贵的子shell和外部命令调用,并且正在使用read
,但是&{1}} #39;不是绝对必要的。
答案 1 :(得分:0)
问题在于命令引用和括号。在shell中调用时引用命令(不是命令运行的shell)。
将“字符更改为'字符。