2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3  След.
 
 Re: Актуальность null
Сообщение18.05.2018, 19:02 
iifat в сообщении #1313235 писал(а):
На всякий случай: в линуксе (точнее, bash, про другие не знаю) кроме > есть ещё и 2> — перенаправление stderr. В Windows про такое не встречал, но почему-то работает тоже.

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

 
 
 
 Re: Актуальность null
Сообщение18.05.2018, 23:43 
Скажите, пожалуйста, а @ в начале строки имеет тот же смысл, что и
Код:
>nul
в окончании?

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

 
 
 
 Re: Актуальность null
Сообщение19.05.2018, 01:11 
Dmitriy40 в сообщении #1313329 писал(а):
Абсолютно разный

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

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

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

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

 
 
 
 Re: Актуальность null
Сообщение19.05.2018, 03:12 
Замените команду echo Текст на dir *.* и посмотрите на разницу в выдаче. Во всех 4-х вариантах наличия/отсутствия и первого и второго. Ну или почитайте наконец документацию.(с)

-- 19.05.2018, 03:22 --

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

 
 
 
 Re: Актуальность null
Сообщение06.06.2018, 19:51 
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 
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 
Sinoid в сообщении #1317670 писал(а):
если поток stdout общий, то он должен содержать и ошибки, а там ничего нет! Это получается, тот поток общий минус ошибки, что ли?
Да, в каждый поток выводится что-то своё, а консоль по умолчанию показывает всё, что послали во все.

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

 
 
 
 Re: Актуальность null
Сообщение06.06.2018, 23:06 
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 
Dmitriy40 в сообщении #1317713 писал(а):
В stdout обычно выводится результат выполнения команды за исключением сообщений об ошибках

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

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

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

?

 
 
 
 Re: Актуальность null
Сообщение07.06.2018, 02:21 
Sinoid в сообщении #1317736 писал(а):
Это вот к этому:
Нет, если я правильно помню, то моё исходное замечание про слеш относилось к разнице между null и \null.

 
 
 
 Re: Актуальность null
Сообщение07.06.2018, 07:39 
Sinoid в сообщении #1317736 писал(а):
Это вот к этому:

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

 
 
 
 Re: Актуальность null
Сообщение07.06.2018, 10:45 
Команда
Код:
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 
Dmitriy40 в сообщении #1317744 писал(а):
Нет, если я правильно помню, то моё исходное замечание про слеш относилось к разнице между null и \null.

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

 
 
 
 Re: Актуальность null
Сообщение07.06.2018, 15:11 
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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group