stdout + stderr Выход ... Есть ли разница между рассмотрением вывода Будьте пустой строкой VS NULL

Отправьте данные в файл, затем отсортируйте их и получите первую строку.

#/bin/sh

echo $VAR1 > $FILE
echo $VAR2 >> $FILE
echo $VAR3 >> $FILE 

RET=$(sort -n $FILE | sort -n)
0
06.12.2018, 05:02
2 ответа

В канале (std -err/out )нет понятия пустой строки, это просто "нет вывода";

> printf '' 
> printf '' | xxd

где null означает что-то

> printf '\0'
> printf '\0' | xxd
00000000: 00

В базе данных все наоборот, и чем меньше, тем лучше, поэтому пусть ваши скрипты молчат (пустая строка )и ваша БД пуста (null ).

1
28.01.2020, 02:41

Не уверен, что понял вопрос, но:

Запись на стандартный вывод выполняет:

write(1, memory_address, length)

Который записывает байты длины, хранящиеся по адресу памяти _, в файловый дескриптор 1 (1 для stdout, 2 для stderr ). Например, в echo test,echo(или оболочка, если echoвстроена в ), выполняет write(1, "test\n", 5).

Хотя это немного глупо, вы можете вызвать системный вызов write()с длиной 0.

С:

write(1, address, 0)

По крайней мере, в Linux системный вызов по-прежнему проверяет, был ли файловый дескриптор открыт в режиме записи или чтения+записи, и что адрес является допустимым адресом (, хотя он не обязательно должен быть доступен для чтения ). ]. Если stdout является сломанным каналом, я не вижу, чтобы он вызывал доставку сигнала SIGPIPE.

Таким образом, выполнение операции нулевого размера строго не эквивалентно отказу от записи вообще, поскольку это может привести к ошибкам.

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

Я обнаружил, что echo -nи printf ''не выполняют никаких write()системных вызовов во всех реализациях, которые я пробовал. функции stdio(fputs()/ printf()/ fwrite()... не выполняют никаких write(), когда вы просите их записать пустую строку ).

Чтобы выполнить запись длиной 0 -, вы можете попробовать:

perl -e 'syswrite(STDOUT, "")'

Или

python -c 'import os; os.write(1, "")'

Которые являются необработанными интерфейсами в этих интерпретаторах для write().

Пример:

$ strace -e write /bin/echo -n
$ strace -e write python -c 'import os; os.write(1, "")'
write(1, "", 0)                         = 0
$ python -c 'import os; os.write(1, "")' >&-
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 9] Bad file descriptor
$ python -c 'import os; os.write(1, "")' 1< /dev/null
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 9] Bad file descriptor
$ printf '%s\n' '#include <unistd.h>' 'main(){write(1,(char*)-1,0);}' | strace -e write tcc -run -
write(1, "", 0)                         = -1 EFAULT (Bad address)
$ printf '%s\n' '#include <unistd.h>' 'main(){write(1,(char*)0,1);}' | strace -e write tcc -run -
write(1, NULL, 1)                       = -1 EFAULT (Bad address)
$ printf '%s\n' '#include <unistd.h>' 'main(){write(1,(char*)0,0);}' | strace -e write tcc -run -
write(1, NULL, 0)                       = 0
0
28.01.2020, 02:41

Теги

Похожие вопросы