Отправьте данные в файл, затем отсортируйте их и получите первую строку.
#/bin/sh
echo $VAR1 > $FILE
echo $VAR2 >> $FILE
echo $VAR3 >> $FILE
RET=$(sort -n $FILE | sort -n)
В канале (std -err/out )нет понятия пустой строки, это просто "нет вывода";
> printf ''
> printf '' | xxd
где null означает что-то
> printf '\0'
> printf '\0' | xxd
00000000: 00
В базе данных все наоборот, и чем меньше, тем лучше, поэтому пусть ваши скрипты молчат (пустая строка )и ваша БД пуста (null ).
Не уверен, что понял вопрос, но:
Запись на стандартный вывод выполняет:
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