Unix: Что делает сам кот?

Я видел строку data=$(cat) в bash script (просто объявляя пустую переменную), и я удивлен, что это может сделать.

Я читал страницы руководства, но у него нет примера или объяснения этого. Это захватывает stdin или что-то еще? Любая документация по этому вопросу?

РЕДАКТИРОВАТЬ: В частности, как черт делает data=$(cat), разрешает ему запускать этот 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

Ответ 1

cat свяжет свой вход с его выходом.

В контексте захваченного вами значения переменной эффект заключается в том, чтобы присвоить переменную стандартный оператор (или содержащий script)).

Подстановка команды $(command) вернет вывод команды; назначение присваивает заменяемую строку переменной; и в отсутствие аргумента имени файла cat будет считывать и печатать стандартный ввод.

Захват Git script, который вы нашли это, фиксирует данные фиксации со стандартного ввода, чтобы он мог быть повторно подключен к каждому крюку script отдельно. Вы получаете только одну копию стандартного ввода, поэтому, если вам это нужно несколько раз, вам нужно как-то захватить ее. (Я бы использовал временный файл и процитировал все переменные имени файла должным образом, но сохранение данных в переменной, безусловно, хорошо, особенно если вы ожидаете достаточно небольших количеств ввода.)

Ответ 2

Doing:

[email protected]:~# temp=$(cat)    
hello how
are you?
[email protected]:~# echo $temp
hello how are you?

(одиночный Control d в строке сам по себе "вы?" завершает ввод.)

Как говорится в руководстве

cat - объединить файлы и распечатать на стандартном выходе

Кроме

cat Скопируйте стандартный ввод в стандартный вывод.

здесь cat объединяет ваш STDIN в одну строку и присваивает его переменной temp.

Ответ 3

Скажите, что ваш bash script script.sh:

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

Затем следующие команды будут хранить строку STR в переменной data:

  • echo STR | bash script.sh
  • bash script.sh < <(echo STR)
  • bash script.sh <<< STR