Stdout bin sh build sh 1 2 stderr ошибка

thimbles = [input() for i in range(int(input()))]
thimbles_temp = []
order = []
for i in range(int(input())):
    for j in range(int(input()):
        order.append(int(input()) - 1)
    for index in order:
        thimbles_temp.append(thimbles[index])
    thimbles = thimbles_temp
print(*thimbles, sep="n")

выдает ошибку(см. ниже) , я думал может со скобочками не так что-то, но все в порядке и не понимаю из за чего такая ошибка?

stdout: /bin/sh ./build.sh 1>&2 Makefile:2: recipe for target ‘build’

failed

stderr: ./solution.py:1:1: E902 TokenError: EOF in multi-line

statement Код не соответствует стандарту PEP8 или в нем есть

синтаксические ошибки make: *** [build] Error 1

milwey

0 / 0 / 0

Регистрация: 26.10.2021

Сообщений: 14

1

В чем здесь ошибка, не понимаю

03.11.2021, 15:40. Показов 6787. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def bubble(line, bruh=None):
    amount_of_lines = len(line)
    switch = False
    while not switch:
        switch = True
    for i in range(amount_of_lines - 1):
        if bruh(line[i]) > bruh(line[i + 1]):
                line[i], line[i + 1] = line[i + 1], line[i]
                switch = False
def conclusion():
    line = [input() for _ in range(3)]
    bubble(line, bruh=lambda x: (len(x), x))
    print(*line, sep="n")

Ошибка оформления кода.

stdout:
/bin/sh ./build.sh 1>&2
Makefile:2: recipe for target ‘build’ failed

stderr:
./solution.py:8:17: E117 over-indented
./solution.py:10:1: E302 expected 2 blank lines, found 0
Код не соответствует стандарту PEP8
или в нем есть синтаксические ошибки
make: *** [build] Error 1



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

03.11.2021, 15:40

Ответы с готовыми решениями:

Не понимаю в чём здесь ошибка, Python
В общем, решаю задачу из книги Майкла Доусона "Программируем на Python", вот сама задача…

Нашел код и не понимаю, где здесь ошибка
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double x, y,xk, dx=0;…

В чем здесь ошибка?
Почему не записывает ответ в C.out?
Program zadanie;
var f1,f2:text;
a,i,sum:integer;
begin…

В чём здесь ошибка?
#include <stdio.h>
#include <stdlib.h>

int main()
{
char str1;
char str2;
int i,g;…

11

4620 / 3156 / 1115

Регистрация: 21.03.2016

Сообщений: 7,852

03.11.2021, 17:34

2

а что в вашей портянке можно понять??? выделить и по скринам действовать

В чем здесь ошибка, не понимаю

В чем здесь ошибка, не понимаю



3



milwey

0 / 0 / 0

Регистрация: 26.10.2021

Сообщений: 14

03.11.2021, 20:06

 [ТС]

3

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def bubble(line, bruh=None):
amount_of_lines = len(line)
switch = False
while not switch:
switch = True
for i in range(amount_of_lines - 1):
if bruh(line[i]) > bruh(line[i + 1]):
line[i], line[i + 1] = line[i + 1], line[i]
switch = False
def conclusion():
line = [input() for _ in range(3)]
bubble(line, bruh=lambda x: (len(x), x))
print(*line, sep="n")



0



Status 418

Эксперт Python

3878 / 2154 / 575

Регистрация: 26.11.2017

Сообщений: 5,034

Записей в блоге: 2

03.11.2021, 20:11

4

Semen-Semenich, теперь отступам придется учить



1



0 / 0 / 0

Регистрация: 26.10.2021

Сообщений: 14

03.11.2021, 20:19

 [ТС]

5

там после «:» должно быть четыре пробела.
Но основная ошибка такая:
Ошибка оформления кода.

stdout:
/bin/sh ./build.sh 1>&2
Makefile:2: recipe for target ‘build’ failed

stderr:
./solution.py:8:17: E117 over-indented
./solution.py:10:1: E302 expected 2 blank lines, found 0
Код не соответствует стандарту PEP8
или в нем есть синтаксические ошибки
make: *** [build] Error 1



0



4494 / 2513 / 529

Регистрация: 07.11.2019

Сообщений: 4,183

03.11.2021, 20:21

6

milwey, отступы сделай!



0



0 / 0 / 0

Регистрация: 26.10.2021

Сообщений: 14

03.11.2021, 20:27

 [ТС]

7

Вот такая задача:
Формат ввода
Вводятся три строки.
Формат вывода
Вывести эти строки в порядке возрастания длины строки. Если длины одинаковы, то по алфавиту.
Пример 1
Ввод
Rhinactinidia eremophila
Rhododendron parvifolium
Melilotoides platycarpos

Вывод
Melilotoides platycarpos
Rhinactinidia eremophila
Rhododendron parvifolium

Добавлено через 1 минуту
u235, я не понимаю как их сделать в этом окошке быстрого ответа



0



4494 / 2513 / 529

Регистрация: 07.11.2019

Сообщений: 4,183

03.11.2021, 20:27

8

milwey, пробелами, как и в редакторе кода.
и код должен быть в тегах.
один тег открывающий, другой закрывающий с косой чертой.
[PYTHON]
и [/PYTHON]



1



milwey

0 / 0 / 0

Регистрация: 26.10.2021

Сообщений: 14

03.11.2021, 20:40

 [ТС]

9

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def bubble(line, bruh=None):
    amount_of_lines = len(line)
switch = False
while not switch:
    switch = True
for i in range(amount_of_lines - 1):
    if bruh(line[i]) > bruh(line[i + 1]):
        line[i], line[i + 1] = line[i + 1], line[i]
switch = False
def conclusion():
    line = [input() for _ in range(3)]
bubble(line, bruh=lambda x: (len(x), x))
print(*line, sep="n")

Добавлено через 3 минуты
u235, поняла, спасибо!
но у меня так и осталась вот эта ошибка:
Ошибка оформления кода.

stdout:
/bin/sh ./build.sh 1>&2
Makefile:2: recipe for target ‘build’ failed

stderr:
./solution.py:8:17: E117 over-indented
./solution.py:10:1: E302 expected 2 blank lines, found 0
Код не соответствует стандарту PEP8
или в нем есть синтаксические ошибки
make: *** [build] Error 1

Я не знаю, как ее исправить



0



4494 / 2513 / 529

Регистрация: 07.11.2019

Сообщений: 4,183

03.11.2021, 20:48

10

milwey, тебе пишет ошибку, что проблемы с отступами. Исправь отступами (пробелами). Почитай про форматирование кода в Python отступами, если проблемы с пониманием.
Теги html и code не нужны. Тебе же скрин показал Semen-Semenich, как надо.



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

35616 / 19509 / 4079

Регистрация: 12.02.2012

Сообщений: 32,555

Записей в блоге: 13

04.11.2021, 08:18

11

milwey, пока не научишься правильно расставлять тэги — не трогай Питон!



1



Автоматизируй это!

Эксперт Python

7110 / 4408 / 1182

Регистрация: 30.03.2015

Сообщений: 12,859

Записей в блоге: 29

04.11.2021, 09:45

12

Цитата
Сообщение от Catstail
Посмотреть сообщение

пока не научишься правильно расставлять тэги — не трогай Питон!

отлить в граните!



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

04.11.2021, 09:45

Помогаю со студенческими работами здесь

В чем здесь ошибка?
class Nastya {

public static void main(String args)
throws java.io.IOException {
char…

В чем здесь ошибка?
Взял пример из книги 3d game programming with DirectX11, немного переделал, т.к. #include…

В чём здесь ошибка?
В чём здесь ошибка?

#include "stdafx.h"
#include <iostream>
#include <string.h>
using…

В чем здесь ошибка ?
<?php
header("Content-Type: text/plain; charset=utf-8");
$lab=array();
$n=50;
$waves=array();…

В чём здесь ошибка?
#include <vcl.h>
#include <conio.h>
#include <iostream>
#include <math.h>
using namespace std;…

В чем здесь ошибка?
Я на сайте изучение программирование на Java там есть онлайн IDE. Нажимаю кнопку Run и пишет…

В чем здесь ошибка?
.ORG0H;
AJMP BEGIN ; переход на начало программы
.ORG 30H;

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

12

Содержание

  1. Что означает «> /dev/null 2>&1»?
  2. Опять непонятная ошибка!
  3. Решение
  4. Решение
  5. Тест на делимость
  6. Ошибка compilation error
  7. Решение
  8. Что такое stdin, stdout и stderr в Linux?
  9. Потоки объединяют две точки
  10. Стандартные потоки Linux
  11. Потоки обрабатываются как файлы
  12. Реагирование на трубы и перенаправления
  13. Перенаправление stdout и stderr
  14. Перенаправление как stdout, так и stderr
  15. Перенаправление stdout и stderr в один файл
  16. Обнаружение перенаправления в скрипте
  17. Потоки Сознания

Что означает «> /dev/null 2>&1»?

Долгое время никто не мог объяснить мне, что за амперсанды, знаки и цифры идут после юниксовых команд. При этом все примеры были показаны без объяснения — зачем все это? Гугл также не давал ответа. Особенно заметно использование таких команд во время работы компилятора. В этой статье постараюсь объяснить эти странные команды.

К примеру, у нас есть такая строчка:
cron job command > /dev/null 2>&1

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

Оператор > («больше чем»), как в примере выше, переадресовывает вывод программы. В данном случае, что-то отправляется в /dev/null, а что-то переадресовывается в &1.

Стандартные ввод, вывод и ошибка

Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.
Результат программы обычно печатается в стандартной вывод и иногда в файл «STDERR» (ошибка). Все это три дескриптора файла (вы можете представить их как «потоки данных», пришли из языка программирования C), которые часто называют STDIN, STDOUT и STDERR.

Но часто к ним обращаются не по имени, а по номеру:
0 — STDIN, 1 — STDOUT и 2 — STDERR
По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT.

В нашем примере видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод). Затем все ошибки (то есть STDERR) перенаправить в стандартный вывод. Необходимо поставить амперсанд «&» перед номером назначения.

Смысл вкратце — «весь вывод указанной команды спихнуть в черную дыру!«.
Это один из способов сделать программу по-настоящему безмолвной. Добавлю, что команда в примере аналогична команде cron job command >/dev/null 2>/dev/null

Официальный FAQ FreeBSD предупреждает: отправка данных в /dev/null/ перегревает ваш процессор 🙂

Источник

Опять непонятная ошибка!

Здравствуйте , писал простой код.
Далее условие:
Пользователь вводит одно за другим целые числа, делящиеся на 10, пока не введёт число, которое не делится на 10. Программа выводит введенные числа до тех пор, пока они делятся на 10.

Но каждый раз выводится ошибка:
wrong answer Answer contains longer sequence [length = 5], but output contains 0 elements
В логе написано:
stdout:
/bin/sh ./build.sh 1>&2

stderr:
Помогите решить проблему,может поправить код,буду очень благодарен!

Опять ошибка
Идет ошибка сегментации, а я в программировании не так силен, понять не могу в чем проблема. (+.

Опять ошибка !
Program lab4; Uses crt; var a,x:integer; n:real; Begin repeat Clrscr; begin .

Опять ошибка 0xc0000005
Сегодня у меня после обновления снова появилась ошибка 0xc0000005 (windows 7 x64). Подскажите если.

Опять ошибка в коде =(
/* * code.cpp * * Created on: 06.11.2011 * Author: Sensei */ #include .

Решение

Решение

Опять ошибка компиляции
Это опять я, спасибо за то, что откликнулись, но не работает. В первом (Silver) примере.

Непонятная ошибка
Недавно начала выскакивать ошибка вот такого содержания: Не могу понять что делать. Судя по.

Непонятная ошибка
Добрый день дамы и господа эксперты. Писал я программу по практическому упражнению книги Лафоре. .

Непонятная ошибка
#include #include #include #include int i; int.

Непонятная ошибка
Привет! Изучаю видео уроки по РПГ игре. У автора в коде нет никаких ошибок. У меня же есть.

Непонятная ошибка
Здраствуйте. Я решаю задачу, нам в школе задали, и вроде бы пишу все по правилам, но выдает ошибку.

Источник

Тест на делимость

Напишите ещё одну программу для самоконтроля навыков устного счёта. Для каждого числа i от 0 до 16 (включительно) вводится с клавиатуры некоторое натуральное число d. Ваша задача — проверить, делится ли i на d, и вывести «ДА» или «НЕТ» в зависимости от этого. (То есть, делится ли 0 на первое введенное число, 1 — на второе введенное число и т.д.) Например, на последней строке вывода будет «ДА», только если на последней строке ввода было 1, 2, 4, 8 или 16.

Если ввод и вывод производится в одной и той же консоли, то строки ввода и вывода будут перемешаны. Автоматической проверке это не помешает.

Формат ввода
17 натуральных чисел.

Формат вывода
Для каждого из введенных чисел сообщение «ДА» или «НЕТ» на отдельной строчке.

Делимость и не делимость двочных чисел
По условию задачи дано что 1110010100011100011111111 делить 1110 невозможно, но на калькуляторе я.

Построение конечных автоматов «делимость на 4» и «делимость на 7»
Как строятся эти автоматы вообще? Это можно понять, не вдаваясь в глубины мат. логики. Есть ли.

Тест (Тест->Создать тест.->Модульный тест.)
есть нечто подобное в билдере ? или вообще программа создающая тесты и на VS и на билдер и пр.? и с.

Делимость на 11
Для делимости числа на 11 необходимо, чтобы разность между суммой цифр, стоящих на четных местах, и.

Делимость на 3 С++
Дана последовательность 1, 12, 123, 1234, 12345, 123456, 1234567, 12345678, 123456789, 12345678910.

Делимость на 9
Проверить делимость произведения двух БОЛЬШИХ чисел на 9. Т.к числа большие, if a mod 9=0 не.

Делимость
Дорогие друзья. Я ни капли не понимаю в математике, особенно дискретной, но от дз, которое я.

Делимость на 7
ребуется определить делимость на 7 ряда целых чисел, записанных в двоичной системе счисления. .

Источник

Ошибка compilation error

fatal error: error writing to /tmp/ccyeyo95.s: No space left on device compilation terminated
Имею странную ошибку. ПОмогите пожалуйста. fatal error: error writing to /tmp/ccyeyo95.s: No.

Ошибка при компиляции PL/SQL — «ORA-24344: success with compilation error»
доброго времени суток! подскажите, что тут написано не так? Потому что, когда программа.

давай поподробнее -всю ошибку, весь текст

Добавлено через 1 минуту
цикл потенциальн бесконечный если а и б ввести маленькие, а с большое число. При вычитании а и б станут меньше 0 и условие остановки никогда не выполнится.

Вот что он пишет
stdout:
/bin/sh ./build.sh 1>&2
Makefile:2: recipe for target ‘build’ failed

stderr:
./solution.py:4:30: E226 missing whitespace around arithmetic operator
Код не соответствует стандарту PEP8
make: *** [build] Error 1

Решение

Compilation error
Решение к задаче 1005 к задаче с Timus Online Judge: using System; namespace 1005 < .

Compilation error
Помогите найти ошибку в проекте. Я решил задачу, у меня все ответы правильные решает правильно, без.

Compilation Error
Решал вот эту задачу: http://********/index.asp?main=task&id_task=297 Код написал следующий: .

Почему Compilation error?
Дан некоторый набор букв и словарь. Ваша задача — подсчитать, сколько различных слов из словаря.

Источник

Что такое stdin, stdout и stderr в Linux?

stdin , stdout и stderr — три потока данных, созданные при запуске команды Linux. Вы можете использовать их, чтобы узнать, передаются ли ваши сценарии по конвейеру или перенаправлены. Мы покажем вам, как.

Потоки объединяют две точки

Как только вы начнете изучать Linux и Unix-подобные операционные системы, вы столкнетесь с терминами stdin , stdout и stederr . Это три стандартных потока , которые устанавливаются при выполнении команды Linux. В вычислениях поток — это то, что может передавать данные. В случае этих потоков эти данные являются текстовыми.

Потоки данных, как и потоки воды, имеют два конца. У них есть источник и отток. Какую бы команду Linux вы не использовали, она обеспечивает один конец каждого потока. Другой конец определяется оболочкой, которая запустила команду. Этот конец будет связан с окном терминала, подключен к каналу или перенаправлен в файл или другую команду в соответствии с командной строкой, которая запустила команду.

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

В Linux стандартный ввод — стандартный поток ввода. Это принимает текст в качестве входных данных. Вывод текста из команды в оболочку осуществляется через поток stdout (standard out). Сообщения об ошибках из команды отправляются через поток stderr (стандартная ошибка).

Итак, вы можете видеть, что есть два выходных потока, stdout и stderr , и один входной поток, stdin . Поскольку сообщения об ошибках и нормальный выход имеют свои каналы для переноса их в окно терминала, они могут обрабатываться независимо друг от друга.

Потоки обрабатываются как файлы

Потоки в Linux — как и почти все остальное — рассматриваются как файлы. Вы можете читать текст из файла, и вы можете написать текст в файл. Оба эти действия связаны с потоком данных. Таким образом, концепция обработки потока данных как файла не так уж и сложна.

Каждому файлу, связанному с процессом, присваивается уникальный номер для его идентификации. Это называется дескриптором файла. Всякий раз, когда требуется выполнить действие над файлом, дескриптор файла используется для идентификации файла.

Эти значения всегда используются для stdin , stdout, и stderr :

Реагирование на трубы и перенаправления

Чтобы облегчить чье-то знакомство с предметом, общепринятым методом является обучение упрощенной версии темы. Например, в грамматике нам говорят, что правило «Я до E, кроме C». Но на самом деле, существует больше исключений из этого правила, чем случаев, которые ему подчиняются.

Аналогичным образом, когда речь идет о stdin , stdout и stderr удобно выдвинуть принятую аксиому о том, что процесс не знает и не заботится о том, где три его стандартных потока завершаются. Должен ли процесс заботиться о том, идет ли его вывод в терминал или перенаправляется в файл? Может ли он даже сказать, поступает ли его ввод с клавиатуры или подается в него из другого процесса?

На самом деле, процесс знает — или, по крайней мере, может узнать, выберет ли он проверку — и может соответствующим образом изменить свое поведение, если автор программного обеспечения решил добавить эту функцию.

Мы можем увидеть это изменение в поведении очень легко. Попробуйте эти две команды:

Команда ls ведет себя по-разному, если ее вывод ( stdout ) передается в другую команду. Именно ls переключается на вывод из одного столбца, это не преобразование, выполняемое cat . И ls делает то же самое, если его вывод перенаправляется:

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x41.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.hyUFiptU3o.png»/>

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

Есть преимущество в том, что сообщения об ошибках доставляются выделенным потоком. Это означает, что мы можем перенаправить вывод команды ( stdout ) в файл и по-прежнему видеть любые сообщения об ошибках ( stderr ) в окне терминала. Вы можете реагировать на ошибки, если вам нужно, по мере их возникновения. Это также предотвращает загрязнение сообщений об ошибках файла, в который был перенаправлен стандартный stdout .

Введите следующий текст в редактор и сохраните его в файл с именем error.sh.

Сделайте скрипт исполняемым с помощью этой команды:

Первая строка скрипта выводит текст в окно терминала через поток stdout . Вторая строка пытается получить доступ к файлу, который не существует. Это сгенерирует сообщение об ошибке, которое доставляется через stderr .

Запустите скрипт с помощью этой команды:

Мы видим, что оба потока вывода, stdout и stderr , были отображены в окнах терминала.

Попробуем перенаправить вывод в файл:

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x3.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.EqpbNlGg0r.png»/>

Сообщение об ошибке, которое доставляется через stderr , все еще отправляется в окно терминала. Мы можем проверить содержимое файла, чтобы увидеть, поступил ли вывод stdout в файл.

Вывод из stdin был перенаправлен в файл, как и ожидалось.

Символ перенаправления > работает с stdout по умолчанию. Вы можете использовать один из числовых файловых дескрипторов, чтобы указать, какой стандартный поток вывода вы хотите перенаправить.

Чтобы явно перенаправить стандартный stdout , используйте эту инструкцию перенаправления:

Чтобы явно перенаправить stderr , используйте эту инструкцию перенаправления:

Давайте попробуем провести наш тест еще раз, и на этот раз мы будем использовать 2> :

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x17.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.JgI_SRjATy.png»/>

Сообщение об ошибке перенаправляется, и echo сообщение stdout отправляется в окно терминала:

capture.txt в окне терминала» width=»646″ height=»97″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2097’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x18.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.DT9oiWeFHK.png»/>

Давайте посмотрим, что находится в файле capture.txt.

Сообщение stderr находится в capture.txt, как и ожидалось.

Перенаправление как stdout, так и stderr

Конечно, если мы можем перенаправить либо stdout либо stderr в файл независимо друг от друга, мы должны быть в состоянии перенаправить их одновременно в два разных файла?

Да мы можем. Эта команда направит стандартный stdout в файл с именем capture.txt, а стандартный stderr — в файл с именем error.txt.

capture.txt 2> error.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x20.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.tfJGMMFL3p.png»/>

Поскольку оба потока вывода — стандартный вывод и стандартная ошибка — перенаправляются в файлы, в окне терминала отсутствует видимый вывод. Мы возвращаемся к командной строке, как будто ничего не произошло.

Давайте проверим содержимое каждого файла:

Перенаправление stdout и stderr в один файл

Это здорово, у нас есть каждый из стандартных выходных потоков, идущих в свой отдельный выделенный файл. Единственная другая комбинация, которую мы можем сделать, это отправить и stdout и stderr в один и тот же файл.

Мы можем добиться этого с помощью следующей команды:

Давайте разберемся с этим.

  • ./error.sh : запускает файл сценария error.sh.
  • > capture.txt : перенаправляет поток stdout в файл capture.txt. > является сокращением для 1> .
  • 2> & 1 : здесь используется инструкция перенаправления &>. Эта инструкция позволяет указать оболочке, чтобы один поток попал в то же место назначения, что и другой поток. В этом случае мы говорим «перенаправить поток 2, stderr , в то же место, куда перенаправляется поток 1, stdout ».

capture.txt 2 &> 1 в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x23.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.E9Im1_c4LS.png»/>

Нет видимого вывода. Это обнадеживает.

Давайте проверим файл capture.txt и посмотрим, что в нем.

Потоки stdout и stderr были перенаправлены в один файл назначения.

Чтобы перенаправить вывод потока данных и отбросить его без вывода сообщений, направьте вывод в /dev/null .

Обнаружение перенаправления в скрипте

Мы обсудили, как команда может обнаружить, перенаправлен ли какой-либо из потоков, и может соответствующим образом изменить свое поведение. Можем ли мы сделать это в наших собственных сценариях? Да мы можем. И это очень простая техника для понимания и применения.

Введите следующий текст в редактор и сохраните его как input.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Умная часть — это проверка в квадратных скобках . Опция -t (терминал) возвращает истину (0), если файл, связанный с дескриптором файла, заканчивается в окне терминала . Мы использовали дескриптор файла 0 в качестве аргумента теста, который представляет стандартный stdin .

Если stdin подключен к окну терминала, тест подтвердится. Если stdin подключен к файлу или каналу, тест не пройден.

Мы можем использовать любой удобный текстовый файл для генерации ввода в скрипт. Здесь мы используем файл с именем dummy.txt.

Вывод показывает, что скрипт распознает, что ввод не с клавиатуры, а с файла. Если вы захотите, вы можете соответствующим образом изменить поведение вашего скрипта.

Это было с перенаправлением файла, давайте попробуем это с каналом.

Сценарий распознает, что его вход передается по каналу. Точнее, он еще раз распознает, что поток stdin не подключен к окну терминала.

Давайте запустим скрипт без каналов и перенаправлений.

Поток stdin подключен к окну терминала, и скрипт сообщает об этом соответственно.

Чтобы проверить то же самое с выходным потоком, нам нужен новый скрипт. Введите следующее в редактор и сохраните его как output.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Единственное существенное изменение в этом скрипте — в тесте в квадратных скобках. Мы используем цифру 1 для представления дескриптора файла для stdout .

Давайте попробуем это. Мы передадим вывод через cat .

Скрипт распознает, что его вывод не идет прямо в окно терминала.

Мы также можем протестировать скрипт, перенаправив вывод в файл.

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x34.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.df5fttcFac.png»/>

Нет вывода в окно терминала, мы молча возвращаемся в командную строку. Как и следовало ожидать.

Мы можем заглянуть внутрь файла capture.txt, чтобы увидеть, что было захвачено. Используйте следующую команду, чтобы сделать это.

Опять же, простой тест в нашем скрипте обнаруживает, что поток stdout не отправляется непосредственно в окно терминала.

Если мы запустим скрипт без каких-либо каналов или перенаправлений, он должен обнаружить, что стандартный stdout доставляется непосредственно в окно терминала.

И это именно то, что мы видим.

Потоки Сознания

Знание того, как определить, подключены ли ваши скрипты к окну терминала, каналу или перенаправлены, позволяет соответствующим образом настроить их поведение.

Регистрация и диагностический вывод могут быть более или менее подробными, в зависимости от того, идет ли речь об экране или в файл. Сообщения об ошибках могут быть записаны в файл, отличный от нормального вывода программы.

Как обычно, больше знаний приносит больше вариантов.

Источник

Содержание

  1. Перенаправление ввода-вывода
  2. STDIN
  3. STDOUT
  4. STDERR
  5. Перенаправление вывода в скриптах
  6. Временное перенаправление вывода
  7. Постоянное перенаправление вывода
  8. Перенаправление ввода в скриптах
  9. Подавление вывода
  10. Что означает «> /dev/null 2>&1»?
  11. Bash-скрипты, часть 4: ввод и вывод
  12. Стандартные дескрипторы файлов
  13. STDIN
  14. STDOUT
  15. STDERR
  16. ▍Перенаправление потока ошибок
  17. ▍Перенаправление потоков ошибок и вывода
  18. Перенаправление вывода в скриптах
  19. ▍Временное перенаправление вывода
  20. ▍Постоянное перенаправление вывода
  21. Перенаправление ввода в скриптах
  22. Создание собственного перенаправления вывода
  23. Создание дескрипторов файлов для ввода данных
  24. Закрытие дескрипторов файлов
  25. Получение сведений об открытых дескрипторах
  26. Подавление вывода
  27. Итоги

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

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

  • 0, STDIN — стандартный поток ввода
  • 1, STDOUT — стандартный поток вывода
  • 2, STDERR — стандартный поток ошибок

STDIN

STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда используется символ перенаправления ввода — , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран. И останавливается после того как получает EOF . EOF вводится нажатием сочетания клавиш Ctrl+D.

STDOUT — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в STDOUT , что приводит к их появлению в консоли. Данные можно перенаправить в файл, для этого используется символ перенаправления вывода > .

Можно осуществить перенаправление вывода в файл с добавлением в конец с помощью >> . При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла.

STDERR

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

Рассмотрим простой пример — нужно записать в файл data.txt содержимое директории data . Если директория не существует, сообщение об ошибке надо записать в файл error.txt . Чтобы этого добиться, нужно использовать команды перенаправления для соответствующих дескрипторов с указанием файлов, куда должны попадать ошибки и стандартный вывод:

Если надо, STDERR и STDOUT можно перенаправить в один и тот же файл, воспользовавшись &> :

Устаревшая форма записи:

Оболочка определяет порядок перенаправления потоков в командной строке слева направо, поэтому приведенный выше пример нельзя записать так:

В этом случае сначала вывод ошибок перенаправляется в стандартный вывод (на экран), а потом стандартный вывод перенаправляется в файл data-error.txt . То есть, ошибки будут выведены в консоль, а данные — в файл.

Для дозаписи в файл data-error.txt

Перенаправление вывода в скриптах

Существует два метода перенаправления вывода в сценариях командной строки:

  • Временное перенаправление, или перенаправление вывода одной строки
  • Постоянное перенаправление, или перенаправление всего вывода сценария

Временное перенаправление вывода

В сценарии можно перенаправить вывод отдельной строки в STDERR . Чтобы это сделать, достаточно использовать команду перенаправления, указав дескриптор STDERR , при этом перед номером дескриптора надо поставить символ амперсанда:

Если запустить этот скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.

Запустим скрипт так, чтобы вывод STDERR попадал в файл:

Теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл error.txt .

Постоянное перенаправление вывода

Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять >&2 к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

После запуска сценария весь вывод будет перенаправлен в файл output.txt .

Команду exec можно использовать не только в начале скрипта, но и в других местах:

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

Для перенаправления ввода можно воспользоваться тем же способом, который использовался для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл data.txt , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

Подавление вывода

Иногда надо сделать так, чтобы команды в скрипте, который, например, может исполняться как фоновый процесс, ничего не выводили на экран. Для этого можно перенаправить вывод в /dev/null .

Вот, например, как подавить вывод сообщений об ошибках:

Тот же подход используется, если, например, надо очистить файл, не удаляя его:

Источник

Что означает «> /dev/null 2>&1»?

Долгое время никто не мог объяснить мне, что за амперсанды, знаки и цифры идут после юниксовых команд. При этом все примеры были показаны без объяснения — зачем все это? Гугл также не давал ответа. Особенно заметно использование таких команд во время работы компилятора. В этой статье постараюсь объяснить эти странные команды.

К примеру, у нас есть такая строчка:
cron job command > /dev/null 2>&1

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

Оператор > («больше чем»), как в примере выше, переадресовывает вывод программы. В данном случае, что-то отправляется в /dev/null, а что-то переадресовывается в &1.

Стандартные ввод, вывод и ошибка

Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.
Результат программы обычно печатается в стандартной вывод и иногда в файл «STDERR» (ошибка). Все это три дескриптора файла (вы можете представить их как «потоки данных», пришли из языка программирования C), которые часто называют STDIN, STDOUT и STDERR.

Но часто к ним обращаются не по имени, а по номеру:
0 — STDIN, 1 — STDOUT и 2 — STDERR
По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT.

В нашем примере видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод). Затем все ошибки (то есть STDERR) перенаправить в стандартный вывод. Необходимо поставить амперсанд «&» перед номером назначения.

Смысл вкратце — «весь вывод указанной команды спихнуть в черную дыру!«.
Это один из способов сделать программу по-настоящему безмолвной. Добавлю, что команда в примере аналогична команде cron job command >/dev/null 2>/dev/null

Официальный FAQ FreeBSD предупреждает: отправка данных в /dev/null/ перегревает ваш процессор 🙂

Источник

Bash-скрипты, часть 4: ввод и вывод

В прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано.

Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки:

  • Отображение выводимых данных на экране.
  • Перенаправление вывода в файл.

Иногда что-то надо показать на экране, а что-то — записать в файл, поэтому нужно разобраться с тем, как в Linux обрабатывается ввод и вывод, а значит — научиться отправлять результаты работы сценариев туда, куда нужно. Начнём с разговора о стандартных дескрипторах файлов.

Стандартные дескрипторы файлов

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов.

Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

  • 0 , STDIN — стандартный поток ввода.
  • 1 , STDOUT — стандартный поток вывода.
  • 2 , STDERR — стандартный поток ошибок.

Эти три специальных дескриптора обрабатывают ввод и вывод данных в сценарии.
Вам нужно как следует разобраться в стандартных потоках. Их можно сравнить с фундаментом, на котором строится взаимодействие скриптов с внешним миром. Рассмотрим подробности о них.

STDIN

STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда в сценариях используют символ перенаправления ввода — , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран.

STDOUT

STDOUT — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в STDOUT , что приводит к их появлению в консоли. Данные можно перенаправить в файл, присоединяя их к его содержимому, для этого служит команда >> .

Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:

То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.

Перенаправление вывода команды в файл

Пока всё хорошо, но что если попытаться выполнить что-то вроде показанного ниже, обратившись к несуществующему файлу xfile , задумывая всё это для того, чтобы в файл myfile попало сообщение об ошибке.

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

Попытка обращения к несуществующему файлу

При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором.

STDERR

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

Итак, предположим, что надо перенаправить сообщения об ошибках, скажем, в лог-файл, или куда-нибудь ещё, вместо того, чтобы выводить их на экран.

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

Как вы уже знаете, дескриптор файла STDERR — 2. Мы можем перенаправить ошибки, разместив этот дескриптор перед командой перенаправления:

Сообщение об ошибке теперь попадёт в файл myfile .

Перенаправление сообщения об ошибке в файл

▍Перенаправление потоков ошибок и вывода

При написании сценариев командной строки может возникнуть ситуация, когда нужно организовать и перенаправление сообщений об ошибках, и перенаправление стандартного вывода. Для того, чтобы этого добиться, нужно использовать команды перенаправления для соответствующих дескрипторов с указанием файлов, куда должны попадать ошибки и стандартный вывод:

Перенаправление ошибок и стандартного вывода

Оболочка перенаправит то, что команда ls обычно отправляет в STDOUT , в файл correctcontent благодаря конструкции 1> . Сообщения об ошибках, которые попали бы в STDERR , оказываются в файле errorcontent из-за команды перенаправления 2> .

Если надо, и STDERR , и STDOUT можно перенаправить в один и тот же файл, воспользовавшись командой &> :

Перенаправление STDERR и STDOUT в один и тот же файл

После выполнения команды то, что предназначено для STDERR и STDOUT , оказывается в файле content .

Перенаправление вывода в скриптах

Существует два метода перенаправления вывода в сценариях командной строки:

  • Временное перенаправление, или перенаправление вывода одной строки.
  • Постоянное перенаправление, или перенаправление всего вывода в скрипте либо в какой-то его части.

▍Временное перенаправление вывода

В скрипте можно перенаправить вывод отдельной строки в STDERR . Для того, чтобы это сделать, достаточно использовать команду перенаправления, указав дескриптор STDERR , при этом перед номером дескриптора надо поставить символ амперсанда ( & ):

Если запустить скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.

Запустим скрипт так, чтобы вывод STDERR попадал в файл.

Как видно, теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл.

Сообщения об ошибках записываются в файл

▍Постоянное перенаправление вывода

Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять соответствующую команду к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

Перенаправление всего вывода в файл

Если просмотреть файл, указанный в команде перенаправления вывода, окажется, что всё, что выводилось командами echo , попало в этот файл.

Команду exec можно использовать не только в начале скрипта, но и в других местах:

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

Перенаправление вывода в разные файлы

Сначала команда exec задаёт перенаправление вывода из STDERR в файл myerror . Затем вывод нескольких команд echo отправляется в STDOUT и выводится на экран. После этого команда exec задаёт отправку того, что попадает в STDOUT , в файл myfile , и, наконец, мы пользуемся командой перенаправления в STDERR в команде echo , что приводит к записи соответствующей строки в файл myerror.

Освоив это, вы сможете перенаправлять вывод туда, куда нужно. Теперь поговорим о перенаправлении ввода.

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

Для перенаправления ввода можно воспользоваться той же методикой, которую мы применяли для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл myfile , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

Вот что появится на экране после запуска скрипта.

В одном из предыдущих материалов вы узнали о том, как использовать команду read для чтения данных, вводимых пользователем с клавиатуры. Если перенаправить ввод, сделав источником данных файл, то команда read , при попытке прочитать данные из STDIN , будет читать их из файла, а не с клавиатуры.

Некоторые администраторы Linux используют этот подход для чтения и последующей обработки лог-файлов.

Создание собственного перенаправления вывода

Перенаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта.

Назначить дескриптор для вывода данных можно, используя команду exec :

После запуска скрипта часть вывода попадёт на экран, часть — в файл с дескриптором 3 .

Перенаправление вывода, используя собственный дескриптор

Создание дескрипторов файлов для ввода данных

Перенаправить ввод в скрипте можно точно так же, как и вывод. Сохраните STDIN в другом дескрипторе, прежде чем перенаправлять ввод данных.

После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно:

В этом примере дескриптор файла 6 использовался для хранения ссылки на STDIN . Затем было сделано перенаправление ввода, источником данных для STDIN стал файл. После этого входные данные для команды read поступали из перенаправленного STDIN , то есть из файла.

После чтения файла мы возвращаем STDIN в исходное состояние, перенаправляя его в дескриптор 6 . Теперь, для того, чтобы проверить, что всё работает правильно, скрипт задаёт пользователю вопрос, ожидает ввода с клавиатуры и обрабатывает то, что введено.

Закрытие дескрипторов файлов

Оболочка автоматически закрывает дескрипторы файлов после завершения работы скрипта. Однако, в некоторых случаях нужно закрывать дескрипторы вручную, до того, как скрипт закончит работу. Для того, чтобы закрыть дескриптор, его нужно перенаправить в &- . Выглядит это так:

После исполнения скрипта мы получим сообщение об ошибке.

Попытка обращения к закрытому дескриптору файла

Всё дело в том, что мы попытались обратиться к несуществующему дескриптору.

Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно.

Получение сведений об открытых дескрипторах

Для того, чтобы получить список всех открытых в Linux дескрипторов, можно воспользоваться командой lsof . Во многих дистрибутивах, вроде Fedora, утилита lsof находится в /usr/sbin . Эта команда весьма полезна, так как она выводит сведения о каждом дескрипторе, открытом в системе. Сюда входит и то, что открыли процессы, выполняемые в фоне, и то, что открыто пользователями, вошедшими в систему.

У этой команды есть множество ключей, рассмотрим самые важные.

  • -p Позволяет указать ID процесса.
  • -d Позволяет указать номер дескриптора, о котором надо получить сведения.

Для того, чтобы узнать PID текущего процесса, можно использовать специальную переменную окружения $$ , в которую оболочка записывает текущий PID .

Ключ -a используется для выполнения операции логического И над результатами, возвращёнными благодаря использованию двух других ключей:

Вывод сведений об открытых дескрипторах

Тип файлов, связанных с STDIN , STDOUT и STDERR — CHR (character mode, символьный режим). Так как все они указывают на терминал, имя файла соответствует имени устройства, назначенного терминалу. Все три стандартных файла доступны и для чтения, и для записи.

Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы:

Вот что получится, если этот скрипт запустить.

Просмотр дескрипторов файлов, открытых скриптом

Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов.

Подавление вывода

Иногда надо сделать так, чтобы команды в скрипте, который, например, может исполняться как фоновый процесс, ничего не выводили на экран. Для этого можно перенаправить вывод в /dev/null . Это — что-то вроде «чёрной дыры».

Вот, например, как подавить вывод сообщений об ошибках:

Тот же подход используется, если, например, надо очистить файл, не удаляя его:

Итоги

Сегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов.

В следующий раз поговорим о сигналах Linux, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах.

Уважаемые читатели! В этом материале даны основы работы с потоками ввода, вывода и ошибок. Уверены, среди вас есть профессионалы, которые могут рассказать обо всём этом то, что приходит лишь с опытом. Если так — передаём слово вам.

Источник

Содержание

  1. Что означает «> /dev/null 2>&1»?
  2. Опять непонятная ошибка!
  3. Решение
  4. Решение
  5. Тест на делимость
  6. Ошибка compilation error
  7. Решение
  8. Что такое stdin, stdout и stderr в Linux?
  9. Потоки объединяют две точки
  10. Стандартные потоки Linux
  11. Потоки обрабатываются как файлы
  12. Реагирование на трубы и перенаправления
  13. Перенаправление stdout и stderr
  14. Перенаправление как stdout, так и stderr
  15. Перенаправление stdout и stderr в один файл
  16. Обнаружение перенаправления в скрипте
  17. Потоки Сознания

Что означает «> /dev/null 2>&1»?

Долгое время никто не мог объяснить мне, что за амперсанды, знаки и цифры идут после юниксовых команд. При этом все примеры были показаны без объяснения — зачем все это? Гугл также не давал ответа. Особенно заметно использование таких команд во время работы компилятора. В этой статье постараюсь объяснить эти странные команды.

К примеру, у нас есть такая строчка:
cron job command > /dev/null 2>&1

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

Оператор > («больше чем»), как в примере выше, переадресовывает вывод программы. В данном случае, что-то отправляется в /dev/null, а что-то переадресовывается в &1.

Стандартные ввод, вывод и ошибка

Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.
Результат программы обычно печатается в стандартной вывод и иногда в файл «STDERR» (ошибка). Все это три дескриптора файла (вы можете представить их как «потоки данных», пришли из языка программирования C), которые часто называют STDIN, STDOUT и STDERR.

Но часто к ним обращаются не по имени, а по номеру:
0 — STDIN, 1 — STDOUT и 2 — STDERR
По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT.

В нашем примере видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод). Затем все ошибки (то есть STDERR) перенаправить в стандартный вывод. Необходимо поставить амперсанд «&» перед номером назначения.

Смысл вкратце — «весь вывод указанной команды спихнуть в черную дыру!«.
Это один из способов сделать программу по-настоящему безмолвной. Добавлю, что команда в примере аналогична команде cron job command >/dev/null 2>/dev/null

Официальный FAQ FreeBSD предупреждает: отправка данных в /dev/null/ перегревает ваш процессор 🙂

Источник

Опять непонятная ошибка!

Здравствуйте , писал простой код.
Далее условие:
Пользователь вводит одно за другим целые числа, делящиеся на 10, пока не введёт число, которое не делится на 10. Программа выводит введенные числа до тех пор, пока они делятся на 10.

Но каждый раз выводится ошибка:
wrong answer Answer contains longer sequence [length = 5], but output contains 0 elements
В логе написано:
stdout:
/bin/sh ./build.sh 1>&2

stderr:
Помогите решить проблему,может поправить код,буду очень благодарен!

Опять ошибка
Идет ошибка сегментации, а я в программировании не так силен, понять не могу в чем проблема. (+.

Опять ошибка !
Program lab4; Uses crt; var a,x:integer; n:real; Begin repeat Clrscr; begin .

Опять ошибка 0xc0000005
Сегодня у меня после обновления снова появилась ошибка 0xc0000005 (windows 7 x64). Подскажите если.

Опять ошибка в коде =(
/* * code.cpp * * Created on: 06.11.2011 * Author: Sensei */ #include .

Решение

Решение

Опять ошибка компиляции
Это опять я, спасибо за то, что откликнулись, но не работает. В первом (Silver) примере.

Непонятная ошибка
Недавно начала выскакивать ошибка вот такого содержания: Не могу понять что делать. Судя по.

Непонятная ошибка
Добрый день дамы и господа эксперты. Писал я программу по практическому упражнению книги Лафоре. .

Непонятная ошибка
#include #include #include #include int i; int.

Непонятная ошибка
Привет! Изучаю видео уроки по РПГ игре. У автора в коде нет никаких ошибок. У меня же есть.

Непонятная ошибка
Здраствуйте. Я решаю задачу, нам в школе задали, и вроде бы пишу все по правилам, но выдает ошибку.

Источник

Тест на делимость

Напишите ещё одну программу для самоконтроля навыков устного счёта. Для каждого числа i от 0 до 16 (включительно) вводится с клавиатуры некоторое натуральное число d. Ваша задача — проверить, делится ли i на d, и вывести «ДА» или «НЕТ» в зависимости от этого. (То есть, делится ли 0 на первое введенное число, 1 — на второе введенное число и т.д.) Например, на последней строке вывода будет «ДА», только если на последней строке ввода было 1, 2, 4, 8 или 16.

Если ввод и вывод производится в одной и той же консоли, то строки ввода и вывода будут перемешаны. Автоматической проверке это не помешает.

Формат ввода
17 натуральных чисел.

Формат вывода
Для каждого из введенных чисел сообщение «ДА» или «НЕТ» на отдельной строчке.

Делимость и не делимость двочных чисел
По условию задачи дано что 1110010100011100011111111 делить 1110 невозможно, но на калькуляторе я.

Построение конечных автоматов «делимость на 4» и «делимость на 7»
Как строятся эти автоматы вообще? Это можно понять, не вдаваясь в глубины мат. логики. Есть ли.

Тест (Тест->Создать тест.->Модульный тест.)
есть нечто подобное в билдере ? или вообще программа создающая тесты и на VS и на билдер и пр.? и с.

Делимость на 11
Для делимости числа на 11 необходимо, чтобы разность между суммой цифр, стоящих на четных местах, и.

Делимость на 3 С++
Дана последовательность 1, 12, 123, 1234, 12345, 123456, 1234567, 12345678, 123456789, 12345678910.

Делимость на 9
Проверить делимость произведения двух БОЛЬШИХ чисел на 9. Т.к числа большие, if a mod 9=0 не.

Делимость
Дорогие друзья. Я ни капли не понимаю в математике, особенно дискретной, но от дз, которое я.

Делимость на 7
ребуется определить делимость на 7 ряда целых чисел, записанных в двоичной системе счисления. .

Источник

Ошибка compilation error

fatal error: error writing to /tmp/ccyeyo95.s: No space left on device compilation terminated
Имею странную ошибку. ПОмогите пожалуйста. fatal error: error writing to /tmp/ccyeyo95.s: No.

Ошибка при компиляции PL/SQL — «ORA-24344: success with compilation error»
доброго времени суток! подскажите, что тут написано не так? Потому что, когда программа.

давай поподробнее -всю ошибку, весь текст

Добавлено через 1 минуту
цикл потенциальн бесконечный если а и б ввести маленькие, а с большое число. При вычитании а и б станут меньше 0 и условие остановки никогда не выполнится.

Вот что он пишет
stdout:
/bin/sh ./build.sh 1>&2
Makefile:2: recipe for target ‘build’ failed

stderr:
./solution.py:4:30: E226 missing whitespace around arithmetic operator
Код не соответствует стандарту PEP8
make: *** [build] Error 1

Решение

Compilation error
Решение к задаче 1005 к задаче с Timus Online Judge: using System; namespace 1005 < .

Compilation error
Помогите найти ошибку в проекте. Я решил задачу, у меня все ответы правильные решает правильно, без.

Compilation Error
Решал вот эту задачу: http://********/index.asp?main=task&id_task=297 Код написал следующий: .

Почему Compilation error?
Дан некоторый набор букв и словарь. Ваша задача — подсчитать, сколько различных слов из словаря.

Источник

Что такое stdin, stdout и stderr в Linux?

stdin , stdout и stderr — три потока данных, созданные при запуске команды Linux. Вы можете использовать их, чтобы узнать, передаются ли ваши сценарии по конвейеру или перенаправлены. Мы покажем вам, как.

Потоки объединяют две точки

Как только вы начнете изучать Linux и Unix-подобные операционные системы, вы столкнетесь с терминами stdin , stdout и stederr . Это три стандартных потока , которые устанавливаются при выполнении команды Linux. В вычислениях поток — это то, что может передавать данные. В случае этих потоков эти данные являются текстовыми.

Потоки данных, как и потоки воды, имеют два конца. У них есть источник и отток. Какую бы команду Linux вы не использовали, она обеспечивает один конец каждого потока. Другой конец определяется оболочкой, которая запустила команду. Этот конец будет связан с окном терминала, подключен к каналу или перенаправлен в файл или другую команду в соответствии с командной строкой, которая запустила команду.

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

В Linux стандартный ввод — стандартный поток ввода. Это принимает текст в качестве входных данных. Вывод текста из команды в оболочку осуществляется через поток stdout (standard out). Сообщения об ошибках из команды отправляются через поток stderr (стандартная ошибка).

Итак, вы можете видеть, что есть два выходных потока, stdout и stderr , и один входной поток, stdin . Поскольку сообщения об ошибках и нормальный выход имеют свои каналы для переноса их в окно терминала, они могут обрабатываться независимо друг от друга.

Потоки обрабатываются как файлы

Потоки в Linux — как и почти все остальное — рассматриваются как файлы. Вы можете читать текст из файла, и вы можете написать текст в файл. Оба эти действия связаны с потоком данных. Таким образом, концепция обработки потока данных как файла не так уж и сложна.

Каждому файлу, связанному с процессом, присваивается уникальный номер для его идентификации. Это называется дескриптором файла. Всякий раз, когда требуется выполнить действие над файлом, дескриптор файла используется для идентификации файла.

Эти значения всегда используются для stdin , stdout, и stderr :

Реагирование на трубы и перенаправления

Чтобы облегчить чье-то знакомство с предметом, общепринятым методом является обучение упрощенной версии темы. Например, в грамматике нам говорят, что правило «Я до E, кроме C». Но на самом деле, существует больше исключений из этого правила, чем случаев, которые ему подчиняются.

Аналогичным образом, когда речь идет о stdin , stdout и stderr удобно выдвинуть принятую аксиому о том, что процесс не знает и не заботится о том, где три его стандартных потока завершаются. Должен ли процесс заботиться о том, идет ли его вывод в терминал или перенаправляется в файл? Может ли он даже сказать, поступает ли его ввод с клавиатуры или подается в него из другого процесса?

На самом деле, процесс знает — или, по крайней мере, может узнать, выберет ли он проверку — и может соответствующим образом изменить свое поведение, если автор программного обеспечения решил добавить эту функцию.

Мы можем увидеть это изменение в поведении очень легко. Попробуйте эти две команды:

Команда ls ведет себя по-разному, если ее вывод ( stdout ) передается в другую команду. Именно ls переключается на вывод из одного столбца, это не преобразование, выполняемое cat . И ls делает то же самое, если его вывод перенаправляется:

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x41.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.hyUFiptU3o.png»/>

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

Есть преимущество в том, что сообщения об ошибках доставляются выделенным потоком. Это означает, что мы можем перенаправить вывод команды ( stdout ) в файл и по-прежнему видеть любые сообщения об ошибках ( stderr ) в окне терминала. Вы можете реагировать на ошибки, если вам нужно, по мере их возникновения. Это также предотвращает загрязнение сообщений об ошибках файла, в который был перенаправлен стандартный stdout .

Введите следующий текст в редактор и сохраните его в файл с именем error.sh.

Сделайте скрипт исполняемым с помощью этой команды:

Первая строка скрипта выводит текст в окно терминала через поток stdout . Вторая строка пытается получить доступ к файлу, который не существует. Это сгенерирует сообщение об ошибке, которое доставляется через stderr .

Запустите скрипт с помощью этой команды:

Мы видим, что оба потока вывода, stdout и stderr , были отображены в окнах терминала.

Попробуем перенаправить вывод в файл:

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x3.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.EqpbNlGg0r.png»/>

Сообщение об ошибке, которое доставляется через stderr , все еще отправляется в окно терминала. Мы можем проверить содержимое файла, чтобы увидеть, поступил ли вывод stdout в файл.

Вывод из stdin был перенаправлен в файл, как и ожидалось.

Символ перенаправления > работает с stdout по умолчанию. Вы можете использовать один из числовых файловых дескрипторов, чтобы указать, какой стандартный поток вывода вы хотите перенаправить.

Чтобы явно перенаправить стандартный stdout , используйте эту инструкцию перенаправления:

Чтобы явно перенаправить stderr , используйте эту инструкцию перенаправления:

Давайте попробуем провести наш тест еще раз, и на этот раз мы будем использовать 2> :

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x17.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.JgI_SRjATy.png»/>

Сообщение об ошибке перенаправляется, и echo сообщение stdout отправляется в окно терминала:

capture.txt в окне терминала» width=»646″ height=»97″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2097’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x18.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.DT9oiWeFHK.png»/>

Давайте посмотрим, что находится в файле capture.txt.

Сообщение stderr находится в capture.txt, как и ожидалось.

Перенаправление как stdout, так и stderr

Конечно, если мы можем перенаправить либо stdout либо stderr в файл независимо друг от друга, мы должны быть в состоянии перенаправить их одновременно в два разных файла?

Да мы можем. Эта команда направит стандартный stdout в файл с именем capture.txt, а стандартный stderr — в файл с именем error.txt.

capture.txt 2> error.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x20.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.tfJGMMFL3p.png»/>

Поскольку оба потока вывода — стандартный вывод и стандартная ошибка — перенаправляются в файлы, в окне терминала отсутствует видимый вывод. Мы возвращаемся к командной строке, как будто ничего не произошло.

Давайте проверим содержимое каждого файла:

Перенаправление stdout и stderr в один файл

Это здорово, у нас есть каждый из стандартных выходных потоков, идущих в свой отдельный выделенный файл. Единственная другая комбинация, которую мы можем сделать, это отправить и stdout и stderr в один и тот же файл.

Мы можем добиться этого с помощью следующей команды:

Давайте разберемся с этим.

  • ./error.sh : запускает файл сценария error.sh.
  • > capture.txt : перенаправляет поток stdout в файл capture.txt. > является сокращением для 1> .
  • 2> & 1 : здесь используется инструкция перенаправления &>. Эта инструкция позволяет указать оболочке, чтобы один поток попал в то же место назначения, что и другой поток. В этом случае мы говорим «перенаправить поток 2, stderr , в то же место, куда перенаправляется поток 1, stdout ».

capture.txt 2 &> 1 в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x23.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.E9Im1_c4LS.png»/>

Нет видимого вывода. Это обнадеживает.

Давайте проверим файл capture.txt и посмотрим, что в нем.

Потоки stdout и stderr были перенаправлены в один файл назначения.

Чтобы перенаправить вывод потока данных и отбросить его без вывода сообщений, направьте вывод в /dev/null .

Обнаружение перенаправления в скрипте

Мы обсудили, как команда может обнаружить, перенаправлен ли какой-либо из потоков, и может соответствующим образом изменить свое поведение. Можем ли мы сделать это в наших собственных сценариях? Да мы можем. И это очень простая техника для понимания и применения.

Введите следующий текст в редактор и сохраните его как input.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Умная часть — это проверка в квадратных скобках . Опция -t (терминал) возвращает истину (0), если файл, связанный с дескриптором файла, заканчивается в окне терминала . Мы использовали дескриптор файла 0 в качестве аргумента теста, который представляет стандартный stdin .

Если stdin подключен к окну терминала, тест подтвердится. Если stdin подключен к файлу или каналу, тест не пройден.

Мы можем использовать любой удобный текстовый файл для генерации ввода в скрипт. Здесь мы используем файл с именем dummy.txt.

Вывод показывает, что скрипт распознает, что ввод не с клавиатуры, а с файла. Если вы захотите, вы можете соответствующим образом изменить поведение вашего скрипта.

Это было с перенаправлением файла, давайте попробуем это с каналом.

Сценарий распознает, что его вход передается по каналу. Точнее, он еще раз распознает, что поток stdin не подключен к окну терминала.

Давайте запустим скрипт без каналов и перенаправлений.

Поток stdin подключен к окну терминала, и скрипт сообщает об этом соответственно.

Чтобы проверить то же самое с выходным потоком, нам нужен новый скрипт. Введите следующее в редактор и сохраните его как output.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Единственное существенное изменение в этом скрипте — в тесте в квадратных скобках. Мы используем цифру 1 для представления дескриптора файла для stdout .

Давайте попробуем это. Мы передадим вывод через cat .

Скрипт распознает, что его вывод не идет прямо в окно терминала.

Мы также можем протестировать скрипт, перенаправив вывод в файл.

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x34.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.df5fttcFac.png»/>

Нет вывода в окно терминала, мы молча возвращаемся в командную строку. Как и следовало ожидать.

Мы можем заглянуть внутрь файла capture.txt, чтобы увидеть, что было захвачено. Используйте следующую команду, чтобы сделать это.

Опять же, простой тест в нашем скрипте обнаруживает, что поток stdout не отправляется непосредственно в окно терминала.

Если мы запустим скрипт без каких-либо каналов или перенаправлений, он должен обнаружить, что стандартный stdout доставляется непосредственно в окно терминала.

И это именно то, что мы видим.

Потоки Сознания

Знание того, как определить, подключены ли ваши скрипты к окну терминала, каналу или перенаправлены, позволяет соответствующим образом настроить их поведение.

Регистрация и диагностический вывод могут быть более или менее подробными, в зависимости от того, идет ли речь об экране или в файл. Сообщения об ошибках могут быть записаны в файл, отличный от нормального вывода программы.

Как обычно, больше знаний приносит больше вариантов.

Источник

thimbles = [input() for i in range(int(input()))]
thimbles_temp = []
order = []
for i in range(int(input())):
    for j in range(int(input()):
        order.append(int(input()) - 1)
    for index in order:
        thimbles_temp.append(thimbles[index])
    thimbles = thimbles_temp
print(*thimbles, sep="n")

выдает ошибку(см. ниже) , я думал может со скобочками не так что-то, но все в порядке и не понимаю из за чего такая ошибка?

stdout: /bin/sh ./build.sh 1>&2 Makefile:2: recipe for target ‘build’

failed

stderr: ./solution.py:1:1: E902 TokenError: EOF in multi-line

statement Код не соответствует стандарту PEP8 или в нем есть

синтаксические ошибки make: *** [build] Error 1

Понравилась статья? Поделить с друзьями:
  • Stdafx h no such file or directory ошибка
  • Stay out ошибка соединения 13 ошибка соединения с сервером
  • Status ошибка invoked on message не удалось завершить задание
  • Status stack buffer overrun ошибка
  • Status failure test failed ошибка ввода вывода