“протестируйте-n &&, повторяют не пустую” печать, “не пустую”. Это - ожидаемое поведение?

Как установить perf инструмент пространства пользователя как некорневой
  1. Получите/найдите источники для kernel-2.6.36-gentoo-r4 (в хинду Linux). Первая проверка из этого ответа

    На самом деле сначала необходимо посмотреть на /usr/src/linux и посмотрите, установлены ли источники ядра все еще. Вы могли просто скопировать их в каталог, в который можно записать.)

    был достаточно, хотя вместо того, чтобы копировать целые источники ядра я просто связал их:

    $ mkdir -p build
    $ cd build
    $ ln -s /usr/src/linux-2.6.36-gentoo-r4
    
  2. Создайте каталог где perf был бы создан, поскольку я не смогу записать в ~/build/linux-2.6.36-gentoo-r4 каталог.

    $ mkdir -p perf
    

    На самом деле это не было тем, от чего я сделал сначала... сообщения об ошибках make были совершенно бесполезны сначала.

  3. Перейдите в tools/perf каталог в источниках ядра

    $ cd linux-2.6.36-gentoo-r4/tools/perf
    
  4. Сборка perf, не упущение о передаче O= опция к make-файлу как каталог не перезаписываема (не было бы такой проблемы, если бы я скопировал, а не symlinked источники ядра).

    $ make O=~/build/perf -k 
    Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev
        * new build flags or prefix
        CC ~/build/perf/perf.o
        CC ~/build/perf/builtin-annotate.o
        [...]
        CC ~/build/perf/util/scripting-engines/trace-event-python.o
        CC ~/build/perf/scripts/python/Perf-Trace-Util/Context.o
        AR ~/build/perf/libperf.a
        LINK ~/build/perf/perf
    ~/build/perf/libperf.a(trace-event-perl.o): In function `define_flag_value':
    ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-perl.c:127: undefined reference to `PL_stack_sp'
    ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-perl.c:131: undefined reference to `Perl_push_scope'
    [...]
    ~/build/perf/libperf.a(trace-event-python.o): In function `handler_call_die':
    ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-python.c:53: undefined reference to `PyErr_Print'
    [...]
    collect2: ld returned 1 exit status
    make: *** [/home/narebski/build/perf/perf] Error 1
        GEN perf-archive
    make: Target `all' not remade because of errors.
    
  5. Google для "неопределенной ссылки на 'Perl_push_scope'". Найдите, что Сбой устанавливает перфект на slackware 13.1 на unix.stackexchange.com. Последуйте совету в сам ответ, или быть большим количеством экс-кошки диагноз:

    $ make O=~/build/perf -k NO_LIBPERL=1 NO_LIBPYTHON=1
    Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev
        * new build flags or prefix
        CC ~/build/perf/perf.o
        CC ~/build/perf/builtin-annotate.o
        [...]
        CC ~/build/perf/util/probe-finder.o
        AR ~/build/perf/libperf.a
        LINK ~/build/perf/perf
        GEN perf-archive
    

    Обратите внимание, что это - обходное решение, а не решение (я имею libperl.so).

  6. Проверьте Make-файл на место назначения установки по умолчанию: $(HOME). Установка perf в собственном корневом каталоге:

    $ make O=~/build/perf -k NO_LIBPERL=1 NO_LIBPYTHON=1 install
    Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev
        GEN perf-archive
    install -d -m 755 '~/bin'
    install ~/build/perf/perf '~/bin'
    [...]
    install scripts/python/bin/* -t '~/libexec/perf-core/scripts/python/bin'
    
  7. Проверьте это ~/bin находится в ПУТИ

  8. Проверьте это perf работы правильно (не забывают к CD в перезаписываемом каталоге):

    $ cd
    $ perf record -f -- sleep 10
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.001 MB perf.data (~61 samples) ]
    

Вывод немного редактируется, заменяя мой корневой каталог с ~.

7
18.02.2019, 22:50
5 ответов

Да, это - ожидаемое поведение. Когда только один аргумент передается test, проверка длины выполнена. От man bash:

тест и [оценивает условные выражения с помощью ряда правил на основе количества аргументов.

0 аргументов: выражение является ложью.

1 аргумент: выражение верно, если и только если аргумент не является нулевым.

Таким образом, по существу это - эквивалент test foo, но использование -n как строка.

9
27.01.2020, 20:16

test -n на первый взгляд уродливо, с тех пор -n требует аргумента. Я полагаю, что некоторые исторические реализации рассматривали его как синтаксическую ошибку (и возвратил ненулевое состояние). Однако во всех оболочках Вы, вероятно, встретитесь в 21-м веке, поведение четко определено (POSIX, следуя существующей практике): если test имеет только один аргумент, затем это верно, если и только если тот аргумент непуст.

Обратите внимание, что при игнорировании кавычек тест может закончить тем, что был ложью для некоторых непустых значений $VAR. Это может даже распечатать сообщение об ошибке, если существуют globbing символы в $VAR.

VAR='foo -a -z bar'; test -n $VAR || echo "true... and false is false"
VAR='= n-'; test -n $VAR || echo "this is an equality test"
VAR='*'; test -n $VAR || echo "you may or may not see this depending on what files are in the current directory"

test -z $VAR так же повреждается.

Ksh, удар и zsh имеют a [[ … ]] условная конструкция, которая подражает традиционному test и [ утилиты. В отличие от этого, [, который или является внешней утилитой или является встроенным, которое анализируется как один, [[ … ]] часть синтаксиса оболочки. Нет никакого разделения слова или globbing внутри [[ … ]]. [[ -n $VAR ]] прекрасен (как долго, поскольку Вы не заботитесь, что Ваши сценарии не будут работать под другими оболочками, такими как пепел).

3
27.01.2020, 20:16

Проверьте также [[ ... ]], который не переносит это поведение:

[[ -n $VAR ]] && echo wrong 3
[[ -n "$VAR" ]] && echo wrong 4
1
27.01.2020, 20:16
  • 1
    Интересный и стоящий знания, но "страдают", вероятно, не правильное слово здесь... [[ ... ]] не то же как [ ... ] который действительно показывает то же поведение как test и функция, упомянутая в man bash... В [[ ... ]] переменная не должна быть "$quoted", который будет распознан переменная (т.е. как аргумент к [[ )... Это сводится к простому случаю: переменная не была заключена в кавычки, и это должно было быть. –  Peter.O 27.01.2012, 16:32

Начиная со здания удара test, и /usr/bin/test приведите к тому же результату, я говорю да, это - ожидаемое поведение.

0
27.01.2020, 20:16

Кажется, когда Вы делаете следующее:

VAR=
test -n $VAR && echo helloworld

Это рассматривает его, как будто аргумент не там:

test -n && echo helloworld

И, по некоторым причинам, когда аргумент не предоставляется, он всегда выполняет команду впоследствии (т.е. он отображает helloworld). Я попробовал это на другом unuary операторе, и он сделал то же самое:

FILENAME=
test -f $FILENAME && echo helloworld

Я думаю, хотите ли Вы ожидать поведение, необходимо заключить аргумент в кавычки:

VAR=
test -n "$VAR" && echo helloworld
FILE=
test -f "$FILE" && echo helloworld

Вышеупомянутые урожаи никакое сообщение, отзывающееся эхом на экран.

Относительно этого ожидаемое поведение? Я не могу найти его в документации нигде, но, это кажется довольно восстанавливаемым и последовательным.

0
27.01.2020, 20:16

Теги

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