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

Альтернативный способ с sed .

Для N = 1 :

sed '$!N; /.*\n.*pattern/P; D' FILE

Для N = 2

sed '1N; $!N; /.*\n.*\n.*pattern/P; D' FILE

Для случая N = 2 в первой строке будет указано следующее ] N-1 строк в пространстве шаблонов, затем запускает цикл N; P; D - считывает еще одну строку и, если последняя строка в пространстве шаблонов совпадает, печатает первую строку в шаблоне пробел, затем удалите его, начав новый цикл.

Обратной стороной является то, что его необходимо изменить для разных значений N :

Для N = 3 :

sed '1{N;N}; $!N; /.*\n.*\n.*\n.*pattern/P; D' FILE

Для N = 4 ]:

sed '1{N;N;N}; $!N; /.*\n.*\n.*\n.*\n.*pattern/P; D' FILE

, поэтому он быстро становится громоздким, хотя для больших значений N вы можете подготовить файл сценария и передать его в sed .

3
02.03.2016, 00:25
2 ответа

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

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

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

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

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

Также выполняется 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 ...>

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


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

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

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

$ 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, семейную оболочку Bourne, Schily osh и Schily sh.

2
27.01.2020, 21:13

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

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

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

4
27.01.2020, 21:13

Теги

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