我在bash脚本中看到了行data=$(cat)
(只是声明一个空变量)并且对于可能做的事情感到困惑。
我阅读了手册页,但它没有这方面的例子或解释。这会捕获stdin或其他东西吗?关于这个的任何文件?
编辑:特别是heck做了什么data=$(cat)
允许它运行这个钩子脚本?
#!/bin/bash
# Runs all executable pre-commit-* hooks and exits after,
# if any of them was not successful.
#
# Based on
# http://osdir.com/ml/git/2009-01/msg00308.html
data=$(cat)
exitcodes=()
hookname=`basename $0`
# Run each hook, passing through STDIN and storing the exit code.
# We don't want to bail at the first failure, as the user might
# then bypass the hooks without knowing about additional issues.
for hook in $GIT_DIR/hooks/$hookname-*; do
test -x "$hook" || continue
echo "$data" | "$hook"
exitcodes+=($?)
done
https://github.com/henrik/dotfiles/blob/master/git_template/hooks/pre-commit
答案 0 :(得分:13)
cat
会将其输入连接到其输出。
在您发布的变量捕获的上下文中,效果是将语句(或包含脚本的)标准输入分配给变量。
命令替换$(command)
将返回命令的输出;赋值将替换的字符串赋值给变量;如果没有文件名参数,cat
将读取并打印标准输入。
您在此处发现的Git钩子脚本从标准输入中捕获提交数据,以便可以分别重复管道到每个钩子脚本。您只能获得一份标准输入,因此如果您需要多次,您需要以某种方式捕获它。 (我会使用一个临时文件,并正确引用所有文件名变量;但将数据保存在变量中肯定是可以的,特别是如果你只需要相当少量的输入。)
答案 1 :(得分:5)
这样做的:
t@t:~# temp=$(cat)
hello how
are you?
t@t:~# echo $temp
hello how are you?
(单个 Control d 本身跟随“是吗?”终止输入。)
正如手册所说
cat - 连接文件并在标准输出上打印
另外
cat将标准输入复制到标准输出。
此处,cat
会将您的STDIN
连接到一个字符串中,并将其分配给变量temp
。
答案 2 :(得分:4)
说你的bash脚本script.sh
是:
#!/bin/bash
data=$(cat)
然后,以下命令将字符串STR
存储在变量data
中:
echo STR | bash script.sh
bash script.sh < <(echo STR)
bash script.sh <<< STR