Linux Unix:cat本身做什么?

Linux Unix:cat本身做什么?,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我在bash脚本中看到了data=$(cat)这一行(只是声明了一个空变量),我对这可能做什么感到困惑 我读了手册页,但没有一个例子或解释。这是不是捕获了stdin或其他什么?有关于这个的文件吗 编辑:具体地说,data=$(cat)如何允许它运行这个钩子脚本 #!/bin/bash # Runs all executable pre-commit-* hooks and exits after, # if any of them was not successful. # # Bas

我在bash脚本中看到了
data=$(cat)
这一行(只是声明了一个空变量),我对这可能做什么感到困惑

我读了手册页,但没有一个例子或解释。这是不是捕获了stdin或其他什么?有关于这个的文件吗

编辑:具体地说,
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 

cat
将其输入连接到输出

在您发布的变量捕获上下文中,效果是将语句(或包含脚本的)标准输入分配给变量

命令替换
$(command)
将返回命令的输出;赋值将被替换的字符串赋值给变量;如果没有文件名参数,
cat
将读取并打印标准输入

您在中找到的Git钩子脚本从标准输入中捕获提交数据,以便可以将其分别重复管道传输到每个钩子脚本。您只获得标准输入的一个副本,因此如果您多次需要它,您需要以某种方式捕获它。(我会使用一个临时文件,并正确引用所有文件名变量;但将数据保存在变量中当然是可以的,特别是如果您只需要相当少量的输入。)

执行以下操作:

t@t:~# temp=$(cat)    
hello how
are you?
t@t:~# echo $temp
hello how are you?
(行上的单个控件在“是你吗?”之后自动终止输入。)

正如手册所说

cat-连接文件并在标准输出上打印

cat将标准输入复制到标准输出


在这里,
cat
将把您的
STDIN
连接成一个字符串,并将其分配给变量
temp

假设您的bash脚本
脚本。sh
是:

#!/bin/bash
data=$(cat)
然后,以下命令将字符串
STR
存储在变量
数据中:

  • echo STR|bash script.sh

  • bash script.sh<您的手册页与我的不同吗?因为我在一个很短的手册页上向下翻页了两次,然后在示例下面的行:“cat——将标准输入复制到标准输出”。一个简短的命令行测试确认这正是它使用0个参数调用的功能。我已经回滚了您最近的编辑。表示您的问题已被回答的方法是接受答案。因为它无法操作开罐器,您会感到非常饥饿。@KeithThompson非常感谢您。这也恰好说明了当您不引用
    echo
    的参数时会发生什么。除非您特别要求shell对
    $temp
    的值执行空格标记化和通配符扩展,否则您需要
    回显“$temp”