Intereting Posts
macos – перенаправление локального порта с использованием pfctl и синтаксических ошибок Что такое разделенные и не разделенные исполняемые файлы в Unix? modinfo, когда модуль был скомпилирован в ядро ​​статически, не работал – обходные пути? Типичные текстовые файлы, присутствующие во всех (большинстве) системах GNU / Linux? Извлечь координаты из KML с помощью инструментов оболочки GnuPG: представления ключевых идентификаторов и отпечатков пальцев Является ли код загрузчика связан с любым другим программным обеспечением? Библиотека библиотеки Python конфликтует с более низкой версией Могу ли я использовать scp для копирования файлов в домашний каталог без указания его? Принудительная запись (2) для возврата 0 Безопасно ли прерывать процесс обновления с Fedora 22 до 23 с помощью dnf? Perl-скрипт в bin, который вызывает файл KDE 100%, если QT_SCALE_FACTOR = 2 Как ядро ​​знает, сколько адресной памяти пользователя нужно отложить? Как установить определенные части libre-office на Arch Linux

Что означает '-size +0' в команде 'test'

Я столкнулся с утверждением if :

 if [ -f <file path> -size +0 ] 

Я знаю, что -f проверяет наличие файла, но что здесь делает -size +0 ?

Я не могу получить справочную страницу man man, также пытался найти форумы, мало любопытно найти это, помогите мне.

Это бессмысленно.

Вот как ksh93 если слишком много аргументов для унарного оператора, а унарный оператор начинается с - , то второй будет выбираться в качестве аргумента, а остальное будет проигнорировано:

 $ ksh -c '[ -f a.out foo bar ] && echo yes' yes $ ksh -c '[ -e a.out foo a ] && echo yes' yes 

(За исключением случаев, когда второй аргумент равен -a/-o , он не будет игнорироваться)

Проверка источника test ksh93 подтверждает это поведение.

Также делаю strace :

 $ { strace -p "$$" & sleep 1; [ -f a.out -size +0 ]; kill "$!"; } [1] 18467 Process 18455 attached restart_syscall(<... resuming interrupted call ...>) = 0 stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat("a.out", {st_mode=S_IFREG|0755, st_size=8320, ...}) = 0 kill(18467, SIGTERMProcess 18455 detached <detached ...> 

Другие подобные Bourne оболочки сообщают об ошибке в этом случае. Поведение не задано POSIX.


Если вы хотите проверить, существует ли файл и размер больше 0, то стандартные оболочки имеют -s test operator:

 [ -s file ] && echo 'file exist and size greater than 0' 

ksh88 тоже ведут себя одинаково. С моей Solaris 10 VM:

 $ ksh -c '[ -f a.out foo bar ] && echo yes' yes $ strings /usr/bin/ksh | grep -i version @(#)Version M-11/16/88i 

Раковины Pre-POSIX также ведут себя так, включают оболочку Bourne в Solaris 10, оболочку Birne реликвии, Schily osh и Schily sh.

Скорее всего, это ошибочно. Форма -size +0 является законной для стандартной утилиты find (и означает непустой файл), но не для test (aka [ ). Кажется, автор сценария повторно использовал его, не сохраняя надлежащего контекста. Если это ksh , он должен иметь следующую проверку:

 –s file True, if file exists and has size greater than zero. 

В качестве альтернативы, этот скрипт предназначен для расширенной оболочки (неизвестной мне), для которой test является внутренним и расширен для таких сложных конструкций. (Является ли ваша ksh конкретной расширенной версией?)