sh и grep числа только

Это зависит от Вашей конфигурации: можно было запустить Сервер X-окна отдельно, и затем процесс менеджера по оформлению или менеджер по оформлению могли запустить сервер X-окна.

Мне запустил X-сервер kdm в OpenSuse 12.1:

kdm(4655)─┬─Xorg(4671)
          └─kdm(4698)───startkde(4800)─┬─gpg-agent(4877)
                                       ├─kwrapper4(4977)
                                       └─ssh-agent(4878) 

Если Вы используете Unix с Xorg и pstree можно проверить:

pstree -p `ps -H -C Xorg -o ppid --no-header` 

или

ps -H -C Xorg -o ppid --no-header | xargs pstree -p
2
06.06.2013, 13:02
4 ответа

Что-то вроде этого должно работать на Вас:

ls /a | egrep "^[0-9]"

На @Anthons обратную связь egrep удерживается от использования, таким образом, можно использовать -E как переключатель к нормальному grep команда вместо этого:

ls /a | grep -E "^[0-9]"

На обратную связь @Stephane расширенные регулярные выражения (ERE's) даже не необходимы в этой ситуации. Действительно то, что имеет значение, является заключением в кавычки ^[0-9] защищать его от того, чтобы быть интерпретируемым любой версией /bin/sh Вы используете, это имеет проблему. Таким образом, что-то вроде этого было бы самой простой фиксацией к Вашей проблеме:

ls /a | grep "^[0-9]"

- или -

ls /a | grep '^[0-9]'
3
27.01.2020, 21:50
  • 1
    egrep удерживается от использования (согласно странице справочника), должен рекомендовать использование grep -E –  Anthon 05.06.2013, 16:01
  • 2
    , таким образом, я предполагаю, что удар интерпретирует ^, в то время как при использовании sh его до grep, корректного? и большое спасибо. –  BitsOfNix 05.06.2013, 16:02
  • 3
    Да, bash интерпретирует тех, которые вместо grep. Я был удивлен, что Вы могли передать те аргументы, пустые как этот w/o двойные кавычки. Я только когда-либо дважды заключал им в кавычки к grep. Вы, возможно, также поместили одинарные кавычки вокруг них также. –  slm♦ 05.06.2013, 16:04
  • 4
    Вам не нужен расширенный REs здесь. Тот синтаксис работает также с BREs как с EREs так e или -E являются лишними. –  Stéphane Chazelas 05.06.2013, 16:47

sh, Я думаю, что Вы обращаетесь к Оболочке Bourne, которая была оболочкой большинства систем Unix перед серединой 90-х и была /bin/sh на Солярисе до Соляриса 11.

На Солярисе 10 и более старый, не использовать /bin/sh. Та оболочка с другой эры. Использовать /usr/xpg4/bin/sh вместо этого.

В Оболочке Bourne ^ псевдоним для | для совместимости с его предшественником оболочка Thompson. Таким образом, Ваша команда похожа:

ls /a|grep |[0-9]

И Оболочка Bourne сообщает, что не может найти команду названной [0-9] и grep жалуется на не получение любого аргумента.

Даже если использование стандарта sh в противоположность Оболочке Bourne я рекомендовал бы заключить в кавычки ^. Например, ^ globbing оператор в zsh когда extendedglob опция включена.

В любом случае, если нет ^, необходимо заключить в кавычки [0-9] так как это - globbing операторы. [0-9] был бы расширен оболочкой до списка файлов в текущем каталоге, имя которого является единственной цифрой.

Так:

ls /a | grep '^[0-9]'

Кстати, в Оболочке Bourne

ls /a ^ grep '^[0-9]'

также работал бы.

3
27.01.2020, 21:50

Вам не нужно ls и grep для этого; можно использовать простой шарик /a/[0-9]*:

echo /a/[0-9]*
ls /a/[0-9]*
grep foo /a/[0-9]*

Если Вы используете это в сценарии, остерегаетесь того парсинга ls вывод является плохой идеей.

2
27.01.2020, 21:50

Я соглашаюсь с l0b0 grep, плохая идея здесь, но так или иначе, здесь объяснение проблемы и обходное решение. На Солярисе 10 и более старый, /bin/sh устаревшая оболочка, которая не должна использоваться ни для чего кроме запущения скриптов прежней версии. Действительно необходимо использовать ksh, bash или /usr/xpg4/bin/sh вместо этого.

Первопричина здесь ^ используемый, чтобы быть исходным способом указать канал в ранние времена Unix. Солярис /bin/sh наследованный эта archaelogical функция.

Обходное решение затем довольно просто, просто выйдите из каре один из этих путей:

ls /a |grep \^[0-9]

или

ls /a |grep "^[0-9]"

или

ls /a |grep '^[0-9]'
1
27.01.2020, 21:50
  • 1
    Первый перестал бы работать, если бы были a ^0 и ^1 файл в текущем каталоге все же. Вы побеждаете меня на 7 секунд на источнике ;) –  Stéphane Chazelas 05.06.2013, 16:38
  • 2
    @StephaneChazelas, Почему первый перестал бы работать? Я просто проверил, и это работало просто великолепно. –  jlliagre 05.06.2013, 19:12
  • 3
    Поскольку оболочка развернула бы его до ls /a | grep '^0' '^1'. Таким образом, это искало бы строки, запускающиеся с 0 в ^1 и проигнорируйте вывод ls. –  Stéphane Chazelas 05.06.2013, 19:49
  • 4
    @StephaneChazelas Получил его, я пропускаю "и".Спасибо. –  jlliagre 05.06.2013, 20:03

Теги

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