Хороший CLI-скрипт должен уметь принимать данные: из файла, из pipe (|) и из stdin. И делать это предсказуемо.
▪️ Проверка: есть ли stdin
if [ -t 0 ]; then
echo "stdin пуст (ввод с терминала)"
else
echo "данные пришли через pipe"
fi
-t 0 - stdin подключен к терминалуиначе - есть входной поток
▪️ Базовый шаблон
#!/usr/bin/env bash
if [ -t 0 ]; then
echo "Usage: command < file | pipe"
exit 1
fi
while IFS= read -r line; do
echo ">> $line"
done
Теперь скрипт работает так:
cat file.txt | script.sh
▪️ Универсальный вариант (stdin + файл)
input="${1:-/dev/stdin}"
while IFS= read -r line; do
echo "$line"
done < "$input"
Теперь можно:
script.sh file.txt
cat file.txt | script.sh
🤩 Частая ошибка
for line in $(cat file.txt); do
echo "$line"
done
Она ломает: пробелы, табы и пустые строки
🤩 Правильно
while IFS= read -r line; do
echo "$line"
done < file.txt
BashTex 📱 #scripts #stdin