我想运行这个 bash 命令:
#!/bin/bash
rep="*"
for f in `ls -R`$rep; do
d='git log '$f'| wc -l'
c=$d
echo $c
done
如何git log myFile | wc -l
从 bash 执行命令?
ps:该命令将返回一个数字:git log myFile | wc -l
答案1
如果您想执行命令并获取输出,请使用下面的行
d=`git 日志`
在你的脚本中你必须改变两件事。我有下面正确的脚本
#!/bin/bash 代表=“*” 对于 `ls -R $rep` 中的 f;做 d=`git 日志 $f|厕所-l` c=$d 回声 $c 完毕
编辑:最初的更正是将引号更改为反引号,以使输出达到 d 变量。另外,$rep 应该在 ls 的反引号内,否则会在最后处理的文件名末尾添加 *。
答案2
我已经回答了你的另一个问题调用 find 的 bash 脚本中的语法错误,所以我不会重复我已经写过的内容我的回答在那里。
不解析输出ls
。您不需要运行ls
来枚举目录中的文件。find
如果需要递归到子目录,请使用。
要获取 的输出wc -l
,请在命令替换中使用它:$(git log "$f" | wc -l)
请注意,变量名称需要用双引号引起来。始终在变量和命令替换周围使用双引号:"$foo"
, "$(foo)"
。双引号会关闭 shell 对变量值或命令输出的进一步处理:如果没有引号,结果将被拆分为被解释为文件通配符模式的单词。使用单引号时,$
符号不会被特殊处理,因此git
会看到$f
而不是值。
find . -type f -exec sh -c '
for x in "$@"; do
c=$(git log "$f" | wc -l)
done
' _ {} +
使用-exec … {} +
代替-exec … {} \;
允许每个大批量文件仅调用一次中间 shell,这会更快一些。
由于 bash ≥4,您不需要使用find
,您可以使用**
语法递归到子目录。
shopt -s globstar
for x in **/*; do
[ -f "$x" ] || continue # skip directories and other non-regular files
git log "$x" | wc -l
done
答案3
据我所知命令:
git log
将显示所有修订历史。如果这是真的,我猜您正在尝试将内容存储在名为 myfile 的文件中,然后您想要计算文件中的行数。
如果这是您想要的,首先您可以通过以下方式保存历史记录:
git log>myFile.txt
现在您需要使用 wc -l 查找行数并将其存储在名为 nOfLines.txt 的文件中
所以你必须这样做:
wc -l<myFile.txt>nOfLines.txt
然后将此文件的内容存储在名为 gitVar 的变量中。
gitVar=$(cat nOfLines.txt)
您可以使用以下命令查看它是否正常工作:
echo "$gitVar"
只需将整个内容捆绑在名为“myCommand.sh”的脚本中,使用 chmod a+x 为其授予权限,然后像命令一样从终端运行该脚本。
答案4
我想你想做:
#!/bin/bash
rep="*"
for f in `ls -R`$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done
请注意 git 命令周围的双引号而不是单引号。
一个较小的解决方案可能是使用:
echo `git log "$f"| wc -l`