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