В последнее время я экспериментировал с ps
командой, и иногда длинные пути переносятся на следующую (или две) строку и затрудняют чтение. Я хочу передать ps
вывод в другую программу, чтобы ограничить вывод x
количеством символов.
Вот то, что у меня есть, но оно работает не совсем правильно:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
оценивается до 167, но не похоже на допустимый ввод для cut
.
Есть ли способ заставить этот тип синтаксиса работать в Bash?
tput rmam; ps aux
zsh
,ksh93
илиbash
хранить терминал в ширину$COLUMNS
Ответы:
Следующие работы:
Это также работает:
Проблема, похоже, заключается в том, что для работы
stty
необходимо иметь tty на стандартном входе. Два вышеупомянутых подхода решают это.Есть еще один вариант. Хотя
stty
stdin и stdout оба перенаправлены в приведенных выше командах, его stderr - нет: он по-прежнему указывает на терминал. Как ни странно,stty
также будет работать, если в качестве входных данных ему будет предоставлен stderr:источник
tee
был добавлен, когда я отлаживал. Это ушло сейчас.<&2
означает получить ваш ввод от стандартной ошибки.stty
получает настройки терминала, открытого на его стандартном вводе (вы делаете, например,stty < /dev/other-tty
чтобы получить настройки другого терминала). Так что не странно, что он не будет работать, если его стандартный ввод - труба или это<&2
работает.Некоторые оболочки нравится
zsh
,bash
илиmksh
автоматически установить$COLUMNS
переменную ширину терминала, так что вам не нужно ссылатьсяstty
здесь.Все реализации, которые
ps
я пробовал, которые поддерживают этот нестандартный (BSD-тип) синтаксис, сами запрашивают ширину терминала. Я удивлен, что твой нет. Я ожидаю, что он будет смотреть на содержимое переменнойCOLUMNS
среды, хотя.Так что вы могли бы сделать:
Если не,
Вы также можете указать терминалу не переносить строки:
источник
Вы также можете обрабатывать
ps
вывод немного лучше.Это скажет вам при
ps
необходимости проанализировать его вывод в соответствии с вашими требованиями.Конечно, если вы не переносите слова, то у вас проблема с отсутствием информации. Вам действительно нужно все это для всех процессов? Откройте его в пейджере, если это так:
Если нет, укажите, что вы хотите увидеть:
В качестве альтернативы вы можете явно сообщить
ps
о своем терминале--width
:Эта
--width
вещь работает точно в соответствии с вашими требованиями без необходимости использования каких-либо дополнительных фильтров или вспомогательных процессов (которые, скорее всего, будут только загромождать ваши-aux
результаты). И,$COLUMNS
как показано выше, и, как указывает Стефан, он будет работать даже динамически.Это, вероятно , стоит отметить, однако, что я считаю , люди часто пытаются добавить эти виды ненужных фильтров , чтобы они могли вместить
|pipe
через другой фильтр для разбора вывода , который также очень вероятно, будет излишним. Конечно, под людьми я в основном имею в виду меня.-o
Utput операнда я упомянул выше позволяю фильтровать столбцы , которыеps
отображаются, а при добавлении=
распайки вы можете даже назвать колонки , как вам угодно. Я оставляю назначение пустым и-p
передаю его целевому процессу,$pid
так что единственным выходомps
является$pid
имя команды и ееargs
при вызове. И-o
едва царапает поверхность того, как вы можете определить, чтоps
будет или не будет отображаться. Это направление, которое я бы порекомендовал вам выбрать, особенно через:источник