这实际上很好(我们有> 2k的回复),但我非常希望它一有结果就立即开始产生结果。大多数情况下,它看起来比它更快(通过更多的响应)。
bbrepos(){
#clone[1] is ssh using a filter made the escaping really ugly.
#If it becomes necessary we can use a jq arg
# get max number of repos, ceil(repos / 50), then create a page
#sequence and curl them all
local url=https://api.bitbucket.org/2.0/repositories/twengg
local project=${1:+"q=project.key=\"$1\""}
curl -snL "$url?pagelen=0&page=1" | jq '"$(((\(.size) / 50) + 1 ))"' \
| xargs bash -c 'eval "echo $1"' _ | xargs seq 1 | xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n" \
| xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL "$1/$2" | jq -er .values[].links.clone[1].href' _ $url {} \ #clone[1] is ssh
| sort -u
}工作流程示例:
bbsearch something | xargs -P 20 git clone或者,也可以方便地拥有以下其他工作流:
bbsearch something other thing | xargs -P 20 git clone
cat things-to-find.txt | bbsearch | xargs -P 20 git clone示例有效载荷(通常是很大的,因此我将其简化为所需的内容):
{
"pagelen": 1,
"size": 3054,
"values": [
{
"links": {
"clone": [
{
"href": "https://chb0bitbucket@bitbucket.org/twengg/development-process.git",
"name": "https"
},
{
"href": "git@bitbucket.org:twengg/development-process.git",
"name": "ssh"
}
],
"self": {
"href": "https://api.bitbucket.org/2.0/repositories/twengg/development-process"
}
}
}
],
"page": 1,
"next": "https://api.bitbucket.org/2.0/repositories/twengg?page=2"
}发布于 2019-11-28 19:42:56
eval是邪恶的始终寻找避免eval的方法。
来自已发布代码的相关片段:
curl -snL "$url?pagelen=0&page=1“\区jq‘”$(.size)/ 50) +1))“\ xargs bash -c 'eval "echo $1”_
代码使用jq创建要由Bash计算的格式化表达式,在表达式的中间注入.size。
实现相同目标的更好方法是让jq简单地输出变量本身,然后用Bash编写表达式:
curl -snL "$url?pagelen=0&page=1" \
| jq -r .size \
| xargs bash -c 'echo $((($1 / 50) + 1))' _使用xargs处理一行输入是很奇怪的,而生成另一个Bash只是为了计算表达式是很奇怪的。实际上,没有必要在一个管道中强制执行一系列操作。
我会像这样重写上面的片段:
repos_count=$(curl -snL "$url?pagelen=0&page=1" | jq -r .size)
((pages_count = (repos_count / 50) + 1))将位置参数存储在变量中
必须记住$1和$2的含义是一种心理负担。我会将它们存储在函数开头带有描述性名称的局部变量中。
seq它是否过时了,并非在所有系统中都可用。使用Bash计数循环代替:
for ((page = 1; page <= pages_count; page++)); do
...
done \
| xargs -L 1 ...长管道
当每行有一条语句时,更容易阅读代码。尤其是当一条线太长时,你必须向右滚动才能看到它。所以,不是这样的:
@ xargs bash -c‘clone $1"’_ xargs seq 1\ xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n“\\ xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL”$1/2“而论jq -er .values[].links.clone.href‘’$url {} \#克隆是ssh排序-u
我建议这样写:
| xargs bash -c 'eval "echo $1"' _ \
| xargs seq 1 \
| xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n" \
| xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL "$1/$2" \
| jq -er .values[].links.clone[1].href' _ $url {} \
| sort -u的双引号变量。
在| jq -er .values[].links.clone[1].href' _ $url {}中,你忘了引用$url的双引号。
https://codereview.stackexchange.com/questions/232640
复制相似问题