Linux и Bash

6.1 Стандартные потоки

В Linux каждый процесс имеет три стандартных потока для ввода и вывода данных.

stdin (0) — стандартный ввод

Поток для чтения данных. По умолчанию это клавиатура.


                        cat                    # читает из stdin (клавиатура)
                        # Нажмите Ctrl+D для завершения ввода
                    

stdout (1) — стандартный вывод

Поток для вывода обычных данных. По умолчанию это экран терминала.


                        echo "Hello World"     # выводит в stdout
                        ls                    # выводит список файлов в stdout
                    

stderr (2) — стандартный поток ошибок

Поток для вывода сообщений об ошибках. По умолчанию это тоже экран терминала.


                        ls nonexistent_file   # ошибка выводится в stderr
                        # ls: cannot access 'nonexistent_file': No such file or directory
                    

Разделение потоков

Важно понимать: stdout и stderr — это разные потоки. Это позволяет обрабатывать обычный вывод и ошибки отдельно.

                        # Команда выводит и обычные данные, и ошибки
                        ls existing_file nonexistent_file
                        # existing_file          ← stdout
                        # ls: cannot access...   ← stderr
                    

6.2 Перенаправление вывода

Перенаправление позволяет отправлять вывод команд в файлы или другие программы.

Перенаправление stdout


                        echo "Hello" > file.txt    # записать в файл (перезаписать)
                        echo "World" >> file.txt   # добавить в файл
                        ls > files.txt             # сохранить список файлов
                    

Перенаправление stderr


                        ls nonexistent 2> error.log    # перенаправить ошибки в файл
                        ls existing 2> error.log       # ошибок нет, файл останется пустым
                    

Перенаправление обоих потоков


                        ls existing nonexistent > output.log 2>&1
                        # Перенаправить и stdout, и stderr в один файл
                        
                        ls existing nonexistent &> output.log
                        # Сокращенная запись (bash)
                    

Отбрасывание вывода


                        ls > /dev/null              # отбросить stdout
                        ls 2> /dev/null            # отбросить stderr
                        ls > /dev/null 2>&1        # отбросить все
                    
/dev/null — это специальный файл, который "поглощает" все данные. Полезен для подавления нежелательного вывода.

6.3 Перенаправление ввода

Перенаправление ввода позволяет читать данные из файла вместо клавиатуры.

Перенаправление stdin


                        cat < file.txt              # читать из файла
                        sort < unsorted.txt         # сортировать файл
                        wc -l < file.txt            # подсчитать строки в файле
                    

Heredoc — многострочный ввод


                        cat << EOF
                        Строка 1
                        Строка 2
                        Строка 3
                        EOF
                        # Создает временный файл с содержимым между EOF
                    

Here-string — ввод из переменной


                        text="Hello World"
                        wc -w <<< "$text"           # подсчитать слова в переменной
                    

Практические примеры


                        # Отправить письмо из файла
                        mail user@example.com < message.txt
                        
                        # Создать архив из списка файлов
                        tar -czf archive.tar.gz -T filelist.txt
                        
                        # Выполнить команды из файла
                        bash < script.sh
                    

6.4 Конвейеры (Pipes)

Конвейер (|) передает stdout одной команды в stdin другой команды. Это основа мощных командных конструкций.

Базовое использование


                        ls -la | grep "txt"         # найти файлы .txt
                        ps aux | grep firefox       # найти процессы firefox
                        cat file.txt | sort         # отсортировать файл
                    

Цепочки команд


                        ls -la | grep "txt" | wc -l     # подсчитать .txt файлы
                        ps aux | grep firefox | awk '{print $2}'  # получить PID firefox
                        cat log.txt | grep ERROR | sort | uniq    # уникальные ошибки
                    

Полезные команды для конвейеров

grep — поиск текста


                            ps aux | grep python        # найти процессы python
                            ls -la | grep -v "txt"      # исключить .txt файлы
                            cat file.txt | grep -i error # поиск без учета регистра
                        

sort — сортировка


                            ls -la | sort -k5 -nr       # сортировать по размеру (убывание)
                            cat names.txt | sort        # отсортировать имена
                        

uniq — удаление дубликатов


                            cat file.txt | sort | uniq  # уникальные строки
                            cat file.txt | sort | uniq -c  # с подсчетом
                        

head и tail — начало и конец


                            ls -la | head -10           # первые 10 файлов
                            ps aux | tail -5            # последние 5 процессов
                        

Сложные примеры


                        # Найти 5 самых больших файлов
                        find /home -type f -exec ls -la {} \; | sort -k5 -nr | head -5
                        
                        # Мониторинг логов в реальном времени
                        tail -f /var/log/syslog | grep ERROR
                        
                        # Статистика использования команд
                        history | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
                    
Обратите внимание: stderr не передается через конвейер. Для передачи ошибок используйте 2>&1.