Как не потерять цвет при выводе трубы в переменную [дубликат]

Объект вне функции передается в функцию, указывая ссылку на внешний obejct. Когда вы используете эту ссылку для манипулирования своим объектом, объект наружу, таким образом, затрагивается. Однако, если внутри функции вы решили указать ссылку на что-то еще, вы вообще не повлияли на объект снаружи, потому что все, что вы делали, перенаправляло ссылку на что-то еще.

21
задан Dennis Williamson 24 February 2010 в 17:29
поделиться

2 ответа

Ваш grep, вероятно, удаляет цветовые коды ls, потому что он имеет свою собственную окраску.

Вы «можете» сделать это:

ls -l --color=always | grep --color=never pattern

Однако, очень важно, чтобы вы поняли, что именно вы здесь grep ping. Не только grep ping ls не нужен (вместо этого используйте glob), этот конкретный случай - grep пинг через не только имена файлов и статистику файла, но также и цветовые коды, добавленные ls!

Настоящий ответ на ваш вопрос: Не grep это. Никогда не нужно трубить ls во что угодно или захватывать его вывод. ls предназначен только для интерпретации человека (например, look в только в интерактивной оболочке, и для этой цели это очень удобно, конечно). Как уже упоминалось ранее, вы можете отфильтровать, какие файлы ls перечислены с помощью глобусов:

ls -l *.txt      # Show all files with filenames ending with `.txt'.
ls -l !(foo).txt # Show all files with filenames that end on `.txt' but aren't `foo.txt'. (This requires `shopt -s extglob` to be on, you can put it in ~/.bashrc)

Я настоятельно рекомендую вам прочитать эти два превосходных документа по этому вопросу:

46
ответ дан yoniLavi 22 August 2018 в 18:58
поделиться
  • 1
    Как обычно, кодирование оболочки на более высоких (и нормальных) уровнях. ++ – TheBonsai 15 May 2009 в 12:15
  • 2
    +1, отличное объяснение, и это действительно хорошие ссылки! – Andy 15 May 2009 в 12:26
  • 3
    @lhunath Я никогда не понимал, насколько плоха такая практика, спасибо за ссылки, и хотя я использовал какое-то расширенное регулярное выражение, я попытаюсь перенести его в glob и использовать изнутри внутри ls – duckyflip 15 May 2009 в 12:47
  • 4
    @ orange80: Не набирать вывод find (1) на xargs (1). xargs является сломанным инструментом, поскольку он пытается быть «умным». и разбивает ваши входные имена файлов, где есть пробелы и кавычки. Никто никогда не должен использовать xargs (за исключением редкого случая, когда вы используете -0, который имеет почти всегда лучшие альтернативы). Вместо этого просто используйте команду find -exec {} +. Он делает то же самое, что и xargs, за исключением того, что он не изнасиловает ваши имена файлов (и у вас нет потока + дополнительный синтаксический анализ + дополнительные процессы). – lhunath 27 January 2011 в 10:36
  • 5
    Ницца. AFAIK не может использовать glob для фильтрации символических ссылок, как в этом примере: ls -l --color=always /dev/disk/by-uuid/ | grep --color=never sda – A.D. 22 October 2014 в 21:59

Вы должны проверить, действительно ли вы используете «реальные» ls, просто путем прямого вызова двоичного файла:

/bin/ls ....

Потому что: Код, который вы описали, действительно должен работать, если только ls игнорирует --color = всегда для какой-то странной причины или ошибки.

Я подозреваю, что некоторые псевдонимы или функции добавили (напрямую или через переменную) некоторые параметры. Дважды проверьте, что это не так.

0
ответ дан TheBonsai 22 August 2018 в 18:58
поделиться
Другие вопросы по тегам:

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