如何在通过xargs传输时组合多个命令?

时间:2017-09-11 20:49:20

标签: bash shell xargs

我有以下命令:

!nohup fswatch -o ~/Notes -e "\\.git.*" | xargs -n 1 -I {} sh ~/auto_commit.sh > /dev/null 2>&1 &

我想内联auto_commit.sh文件中的内容:

cd ~/Notes
git add -A
git commit --allow-empty-message -am ""

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

我最终得到的解决方案是:

nohup fswatch -o ~/Notes -e "\\.git.*" | xargs -n 1 -I {} sh -c 'cd ~/Notes; git add -A; git commit --allow-empty-message -m ""' > /dev/null 2>&1 &'

感谢Will Barnwell和你的帮助。

此外,这是一个vim脚本,所以格式必须略有不同(如果其他人正在寻找类似问题的解决方案):

autocmd BufWinEnter *.note silent! execute '!nohup fswatch -o . -e "\\.git.*" | xargs -n 1 -I {} sh -c ''git add -A; git commit --allow-empty-message -m ""'' > /dev/null 2>&1 &'

请注意,Barnwell错误的地方是{..}不是子shell,sh -c命令需要字符串。所以花括号是不必要的,在我的例子中添加了一个不需要的git提交消息。

此外,当在vim脚本中使用vim execute函数时,整个命令必须用引号括起来。加倍单引号(不是双引号)让execute函数接受参数作为普通字符串,并且工作正常。