Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unix: What does cat by itself do?

I saw the line data=$(cat) in a bash script (just declaring an empty variable) and am mystified as to what that could possibly do.

I read the man pages, but it doesn't have an example or explanation of this. Does this capture stdin or something? Any documentation on this?

EDIT: Specifically how the heck does doing data=$(cat) allow for it to run this hook script?

#!/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

like image 736
MrPickles Avatar asked Jun 30 '15 15:06

MrPickles


2 Answers

cat will catenate its input to its output.

In the context of the variable capture you posted, the effect is to assign the statement's (or containing script's) standard input to the variable.

The command substitution $(command) will return the command's output; the assignment will assign the substituted string to the variable; and in the absence of a file name argument, cat will read and print standard input.

The Git hook script you found this in captures the commit data from standard input so that it can be repeatedly piped to each hook script separately. You only get one copy of standard input, so if you need it multiple times, you need to capture it somehow. (I would use a temporary file, and quote all file name variables properly; but keeping the data in a variable is certainly okay, especially if you only expect fairly small amounts of input.)

like image 85
tripleee Avatar answered Sep 28 '22 03:09

tripleee


Doing:

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.)

As manual says

cat - concatenate files and print on the standard output

Also

cat Copy standard input to standard output.

here, cat will concatenate your STDIN into a single string and assign it to variable temp.

like image 40
Rakholiya Jenish Avatar answered Sep 28 '22 03:09

Rakholiya Jenish