Как сохранить содержимое переменной после конвейера

Как сохранить содержимое переменной после конвейера

У меня есть следующий скрипт

#!/bin/bash
file="$1"
cat $file
n=$(cat $file | wc -l)
cat $file

Я использую его так, что cat some_file.txt | myScript.sh первый catвыводит содержимое файла, а второй нет. Как мне сохранить содержимое переменной после конвейера?

решение1

Это не делает то, что вы думаете. $1Это первый параметр, который вы передаете скрипту, но на самом деле вы ничего не передаете. Это означает, что cat $fileфактически становится catодиноким. Если не задано никаких аргументов, catпросто выведет свои входные данные:

$ echo "foo" | cat
foo

Итак, первый catвыводит ввод, содержимое файла. У второго ввода нет, так как все занято первым, поэтому он ничего не делает. То, что вы хотите сделать, это что-то вроде:

myscript.sh file

Это приведет к тому, что содержимое файла будет распечатано дважды, а также сохранено cat $file |wcв переменной n.


Если вы хотите сохранить содержимое файла в формате $file, попробуйте:

file="$(cat < "$1")"

И запустите скрипт с именем файла в качестве аргумента:

script.sh file

Связанный контент