2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Актуальность null
Сообщение18.05.2018, 19:02 


05/09/16
12064
iifat в сообщении #1313235 писал(а):
На всякий случай: в линуксе (точнее, bash, про другие не знаю) кроме > есть ещё и 2> — перенаправление stderr. В Windows про такое не встречал, но почему-то работает тоже.

Оно там работало всегда, еще когда линукса вообще не было, а Торвальдс учился в школе :mrgreen:

 Профиль  
                  
 
 Re: Актуальность null
Сообщение18.05.2018, 23:43 


03/06/12
2867
Скажите, пожалуйста, а @ в начале строки имеет тот же смысл, что и
Код:
>nul
в окончании?

 Профиль  
                  
 
 Re: Актуальность null
Сообщение19.05.2018, 00:25 
Заслуженный участник


20/08/14
11780
Россия, Москва
Абсолютно разный: @ подавляет выдачу в консоль текста команды, а >nul подавляет (точнее перенаправляет "в никуда") выдачу текстового результата выполнения команды (а не самой команды). Сравните что будет в консоли для трёх почти одинаковых строчек в батнике:
Код:
echo Раз.
@echo Два.
@echo Три. >nul
И обратите внимание что "Два." печатается в консоли без предыдущего "echo". А "Раз." печатается дважды, сначала с "echo" (как текст выполняемой команды), потом без него (уже как результат выполнения команды).

 Профиль  
                  
 
 Re: Актуальность null
Сообщение19.05.2018, 01:11 


03/06/12
2867
Dmitriy40 в сообщении #1313329 писал(а):
Абсолютно разный

Я имел ввиду по внешним проявлениям.
Dmitriy40 в сообщении #1313329 писал(а):
Код:
echo Раз.
@echo Два.
@echo Три. >nul

Не, я думал, команда
Код:
echo Чытере. >nul

даст тот же видимый результат, что и
Код:
@echo Два.

, но что-то идет не так. Подумаю.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение19.05.2018, 03:12 
Заслуженный участник


20/08/14
11780
Россия, Москва
Замените команду echo Текст на dir *.* и посмотрите на разницу в выдаче. Во всех 4-х вариантах наличия/отсутствия и первого и второго. Ну или почитайте наконец документацию.(с)

-- 19.05.2018, 03:22 --

В комбинации @dir *.* >nul символ @ запрещает вывод текста "dir *.* >nul", а >nul запрещает вывод списка файлов (т.е. результата выполнения команды). И они действуют независимо.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение06.06.2018, 19:51 


03/06/12
2867
wrest в сообщении #1313161 писал(а):
вывод может идти в два потока -- стандартный stdout и ошибок stderr

Решил я воочию увидеть разницу между этими потоками. Сейчас у меня на компе 2 жестких диска - C: и D:, подключена флэшка J:, раньше была подключена флэшка G:, но я ее вытащил. Положил файл lshort2e.pdf в папку, в ту же папку положил батник следующего содержания:
Код:
cd /d %0\..
chcp 1251
copy lshort2e.pdf D: >>2.txt
echo перед1 >>2.txt
copy lshort2e.pdf M: 2>>2.txt
echo после1 >>2.txt
echo перед2 >>2.txt
copy lshort2e.pdf N: 1>>2.txt
echo после2 >>2.txt
echo перед3 >>2.txt
copy lshort2e.pdf G: 2>>2.txt
echo после3 >>2.txt
echo перед4 >>2.txt
copy lshort2e.pdf J: 2>>2.txt
echo после4 >>2.txt
echo перед5 >>2.txt
copy lshort2e.pdf C:\ 1>>2.txt
echo после5 >>2.txt
pause

Файл 2.txt оказался таким:
Код:
Скопировано файлов:         1.
перед1
Системе не удается найти указанный диск.
после1
перед2
после2
перед3
Отказано в доступе.
после3
перед4
после4
перед5
Скопировано файлов:         1.
после5

Почти все оказалось предсказуемо: с диском M: все понятно: его нет в компе, вывелось сообщение об ошибке; с диском N: не вполне понятно, если поток stdout общий, то он должен содержать и ошибки, а там ничего нет! Это получается, тот поток общий минус ошибки, что ли?; с диском G: не знал, что так будет, узнал; С диском J: все ясно: ошибок нет, вот ничего и не вывелось; с диском C: ясно, но не полностью: с одной стороны это совпадает с выводом первой команды копирования, что ожидаемо, с другой стороны, без \, даже без указания потока, в файле 2.txt выводится следующее:
Код:
перед5
Невозможно скопировать файл поверх самого себя.
Скопировано файлов:         0.
после5

, что не согласуется с частью кода батника, в которой фигурирует диск D: и с вот этим:
Dmitriy40 в сообщении #1313010 писал(а):
Слеш тут вообще никаким боком.


-- 06.06.2018, 21:38 --

arseniiv в сообщении #1310536 писал(а):
chcp меняет только кодировку консоли, насколько помню. Менять, как там будет ввод и вывод с файлами — если только у программ отдельные настройки есть.

По ходу, не однозначно: такой батник:
Код:
cd /d %0\..
copy *.xls D: >>1.txt
pause

порождает такой файл 1.txt:
Код:
Shapka.xls
Tetrad.xls
‘Є®ЇЁа®ў ­® д ©«®ў:         2.

А такой батник:
Код:
cd /d %0\..
chcp 1251
copy *.xls D: >>1.txt
pause

- уже такой файл 1.txt:
Код:
Shapka.xls
Tetrad.xls
Скопировано файлов:         2.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение06.06.2018, 22:20 


05/09/16
12064
Sinoid в сообщении #1317670 писал(а):
copy lshort2e.pdf D: >>2.txt

Sinoid в сообщении #1317670 писал(а):
copy lshort2e.pdf C:\ 1>>2.txt

Имейте в виду что между
C:
и
C:\
имеется заметная разница
Без слеша, т.е. C: означает "путь к текущей директории на диске С:", а С:\ означает "корень диска C:"
На каждом диске может быть своя текущая директория.
Команда
copy lshort2e.pdf D:
означает "скопировать файл lshort2e.pdf в текущую директорию диска D:", а вовсе не "скопировать файл lshort2e.pdf в корень диска D:" Но может конечно и совпасть, что корень диска и есть текущая директория на нем.

Подробности тут
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#fully_qualified_vs._relative_paths

 Профиль  
                  
 
 Re: Актуальность null
Сообщение06.06.2018, 22:26 
Заслуженный участник


27/04/09
28128
Sinoid в сообщении #1317670 писал(а):
если поток stdout общий, то он должен содержать и ошибки, а там ничего нет! Это получается, тот поток общий минус ошибки, что ли?
Да, в каждый поток выводится что-то своё, а консоль по умолчанию показывает всё, что послали во все.

Sinoid в сообщении #1317670 писал(а):
По ходу, не однозначно
Интересно, хотя и не неожиданно. Попробуйте то же сделать с некоторой программой (а не встроенной командой типа copy — кажется, она не оформлена в виде отдельной программы, или она может быть «предвзятой» к установленной кодировке консоли).

 Профиль  
                  
 
 Re: Актуальность null
Сообщение06.06.2018, 23:06 
Заслуженный участник


20/08/14
11780
Россия, Москва
Sinoid в сообщении #1317670 писал(а):
с диском N: не вполне понятно, если поток stdout общий, то он должен содержать и ошибки, а там ничего нет! Это получается, тот поток общий минус ошибки, что ли?;
С диском N как раз тоже понятно, для него нет вывода в stdout и есть вывод ошибки в stderr, вы же в файл направили лишь stdout вот и ничего не получили.
В stdout обычно выводится результат выполнения команды за исключением сообщений об ошибках, которые идут в stderr. И обычно же stderr объединяется с stdout если не указано прямо их разделить. Но это лишь обычно, каждая программа вправе сама выбирать что куда выводить.

Sinoid в сообщении #1317670 писал(а):
что не согласуется ... и с вот этим:
Слеш тут вообще к другому относился, так что вполне согласуется.

-- 06.06.2018, 23:25 --

О кодировке консоли. Это дело тёмное. Я вот только что написал свою программу из двух строк
Используется синтаксис Delphi
{$APPTYPE CONSOLE}
begin
        Writeln('DOS ЄR¤ЁаRўЄ ');
        Writeln('WIN кодировка');
end.
так она выводит правильный текст лишь в первой строке, независимо от команд chcp 866 или chcp 1251:
Используется синтаксис Text
Z:\>chcp 866
Текущая кодовая страница: 866
Z:\>z3.exe
DOS кодировка
WIN ъюфшЁютър
Z:\>chcp 1251
╥хъє∙р  ъюфютр  ёЄЁрэшЎр: 1251
Z:\>z3.exe
DOS кодировка
WIN ъюфшЁютър
Z:\>
причём при перенаправлении в файл z3.log оба сообщения после chcp 866 и chcp 1251 выводятся правильно, в DOS кодировке, а в консоли - нет, в разных!
Получается конвертация выводимого текста происходит лишь в момент вывода именно в консоль, не в файл, уже после получения текста от программы, внутри самой консоли.
Более того, при выводе в консоль сохранённого файла командой type z3.log вывод всегда происходит в DOS кодировке, даже после команды в консоли chcp 1251 - т.е. команда type нагло игнорирует текущую кодировку консоли и тупо пересылает байтики из файла на экран, без перекодировки.

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

 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 01:37 


03/06/12
2867
Dmitriy40 в сообщении #1317713 писал(а):
В stdout обычно выводится результат выполнения команды за исключением сообщений об ошибках

Ну, как я и предполагал:
Sinoid в сообщении #1317670 писал(а):
Это получается, тот поток общий минус ошибки

Dmitriy40 в сообщении #1317713 писал(а):
Слеш тут вообще к другому относился, так что вполне согласуется.

Это вот к этому:
wrest в сообщении #1317707 писал(а):
Имейте в виду что между
C:
и
C:\
имеется заметная разница

?

 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 02:21 
Заслуженный участник


20/08/14
11780
Россия, Москва
Sinoid в сообщении #1317736 писал(а):
Это вот к этому:
Нет, если я правильно помню, то моё исходное замечание про слеш относилось к разнице между null и \null.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 07:39 


05/09/16
12064
Sinoid в сообщении #1317736 писал(а):
Это вот к этому:

Нет. Это к тому что записи C: и C:\ это не одно и то же. Ну чтобы вы понимали куда именно будет копироваться файл и не удивлялись тому куда он копируется на самом деле.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 10:45 


05/09/16
12064
Команда
Код:
copy file1.txt c:

Означает: скопировать файл с именем file1.txt находяийся в текущей папке, в текущую папку диска c: Поэтому, если текущий диск с: то это команда скопировать файл сам в себя (если конечно текущий диск это диск c:).
А команда
Код:
copy file1.txt c:\

Означает: скопировать файл с именем file1.txt находящийся в текущей папке, в корневую папку диска c:

Поэтому вы и получили вот эту ошибку когда писали букву диска, двоеточие и не поставили слеш:
Sinoid в сообщении #1317670 писал(а):
Код:
перед5
Невозможно скопировать файл поверх самого себя.
Скопировано файлов: 0.
после5


 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 14:08 


03/06/12
2867
Dmitriy40 в сообщении #1317744 писал(а):
Нет, если я правильно помню, то моё исходное замечание про слеш относилось к разнице между null и \null.

Так я и не пробовал это делать: вот это точно не пришло бы мне в голову.

 Профиль  
                  
 
 Re: Актуальность null
Сообщение07.06.2018, 15:11 


03/06/12
2867
wrest в сообщении #1317811 писал(а):
Команда
Код:

copy file1.txt c:

Означает: скопировать файл с именем file1.txt находяийся в текущей папке, в текущую папку диска c: Поэтому, если текущий диск с: то это команда скопировать файл сам в себя (если конечно текущий диск это диск c:).
А команда
Код:

copy file1.txt c:\

Означает: скопировать файл с именем file1.txt находящийся в текущей папке, в корневую папку диска c:

Да, действительно, написал батник
Используется синтаксис Text
cd /d %0\..
copy D:\tema.pdf C:
copy D:\tema.pdf C:\
pause

Все стало очевидно.
arseniiv в сообщении #1317710 писал(а):
Попробуйте то же сделать с некоторой программой

Что- то не могу ничего подходящего пока придумать.
wrest в сообщении #1317707 писал(а):
Подробности тут
https://msdn.microsoft.com/en-us/librar ... 47(v=vs.85).aspx#fully_qualified_vs._relative_paths

Язык...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group