Как осуществить чтение ввода из стандартного потока (stdin) или из файла?

Как можно обновить утилиту cat так, чтобы она проверяла наличие имени файла, и если оно не указано, то читала ввод из потока stdin? 
  • 14 января 2024 г. 15:28
Ответы на вопрос 3
Для чтения из стандартного потока ввода (stdin) или из файла, обычно используют функции или утилиты, предоставляемые операционной системой и языком программирования. Если вам нужен скрипт на Bash, команда `cat` по умолчанию читает из stdin, если ей не переданы аргументы с именами файлов.

Пример улучшенной версии утилиты `cat` на Bash, которая проверяет наличие аргумента (имени файла), и если он не указан, читает из `stdin`:

```bash
#!/bin/bash

# Проверяем, передан ли хотя бы один аргумент скрипту
if [ $# -eq 0 ]; then
    # Поток ввода - stdin
    cat
else
    # Иначе считываем данные из файла(ов)
    for fname in "$@"; do
        if [ -e "$fname" ]; then
            cat "$fname"
        else
            echo "Файл $fname не существует." >&2
        fi
    done
fi
```

Сохраните этот скрипт в файл с каким-нибудь именем, например `mycat.sh`, сделайте его исполняемым:

```bash
chmod +x mycat.sh
```

И теперь вы можете использовать `./mycat.sh` для чтения из `stdin` при отсутствии аргументов или для чтения из файла, если имя файла указано в качестве аргумента.

Если вы хотите использовать другой язык программирования, такой как Python, для выполнения аналогичной задачи, вот пример скрипта на Python:

```python
#!/usr/bin/env python3
import sys

# Проверяем, переданы ли аргументы (имена файлов)
if len(sys.argv) == 1:
    # Если нет аргументов, читаем из stdin
    for line in sys.stdin:
        print(line, end='')
else:
    # Иначе, читаем из файлов
    for fname in sys.argv[1:]:
        try:
            with open(fname, 'r') as f:
                print(f.read(), end='')
        except FileNotFoundError:
            print(f"Файл {fname} не найден.", file=sys.stderr)
```

Этот скрипт можно запустить так же, как Bash-скрипт, предварительно сделав его исполняемым:

```bash
chmod +x mycat.py
```

Теперь вы можете использовать `./mycat.py` для чтения данных аналогично предыдущему примеру.
2 варианта: 
- Если аргументов вообще нет, то через poll (либо select ) проверяешь событие доступности данных - SO
- Некоторые Unix программы проверяют, что если передан дефис/тире - , то читать надо из stdin (учитывай)
Переменная argc равна 1, если в массиве argv содержится только имя исполняемого файла (argv[0]).
Похожие вопросы