Unix:cat命令不带参数会做什么?

14

我在一个bash脚本中看到了这一行代码:data=$(cat),它只是声明一个空变量,但我不知道它到底是干什么的。

我阅读了man手册,但它没有对此进行示例或解释。这是捕获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 

https://github.com/henrik/dotfiles/blob/master/git_template/hooks/pre-commit


5
你的man手册和我的不一样吗?因为在一个非常短的man手册上,我按了两次"Page Down"键,才看到了"cat -- 将标准输入复制到标准输出"这一行在示例下面。通过一个简短的命令行测试可以确认,使用0个参数调用它确实就是这样做的。 - Two-Bit Alchemist
3
我已经撤回了你最近的编辑。表示你的问题已得到解答的方式是接受一个答案。 - Keith Thompson
因为无法操作开罐器,所以变得非常饥饿。 - Sobrique
3个回答

12

cat会将输入附加到输出中。

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

命令替换$(command)将返回命令的输出;赋值将把替换的字符串赋给变量;在没有文件名参数的情况下,cat将读取和打印标准输入。

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


5

正在进行:

t@t:~# temp=$(cat)    
hello how
are you?
t@t:~# echo $temp
hello how are you?

(A single Controld on the line by itself following "are you?" terminates the input.)
根据说明书所述,单独一行上的Controld将终止输入。
此外,

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

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

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

这也巧妙地说明了当您不引用echo的参数时会发生什么。除非您特别需要shell对$temp的值执行空格标记化和通配符扩展,否则您应该使用echo "$temp" - tripleee

4

假设你的bash脚本名为 script.sh

#!/bin/bash
data=$(cat)

接下来,以下命令将把字符串STR存储在变量data中:

  1. echo STR | bash script.sh
  2. bash script.sh < <(echo STR)
  3. bash script.sh <<< STR

注意:请勿删除HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接