Эхо пс при сохранении перевода строки? - PullRequest
10 голосов
/ 07 июля 2011

Если я введу ps ax в Терминале, результат будет таким:

  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     2:23.26 /sbin/launchd
   10   ??  Ss     0:08.34 /usr/libexec/kextd
   11   ??  Ss     0:48.72 /usr/sbin/DirectoryService
   12   ??  Ss     0:26.93 /usr/sbin/notifyd

Пока я делаю echo $(ps ax), я получаю:

PID TT STAT TIME COMMAND 1 ?? Ss 2:23.42 /sbin/launchd 10 ?? Ss 0:08.34 /usr/libexec/kextd 11 ?? Ss 0:48.72 /usr/sbin/DirectoryService 12 ?? Ss 0:26.93 /usr/sbin/notifyd

Почему?

А как мне сохранить символы новой строки и символы табуляции?

Ответы [ 6 ]

31 голосов
/ 07 июля 2011

Как всегда: используйте кавычки.

echo "$(ps ax)"
6 голосов
/ 07 июля 2011

Просто используйте двойные кавычки в переменной echo'd

echo "$(ps ax)"

это сделает это без всего лишнего ненужного кодирования или хлопот.

править: тьфу ... кто-то меня избил! лол

2 голосов
/ 07 июля 2011

Это потому, что echo вообще не является конвейером - он интерпретирует вывод ps ax как переменную, а (без кавычек) переменные в bash по существу сжимают пробелы - включая символы новой строки.

ЕслиВы хотите передать вывод ps, а затем передать:

ps ax | ... (some other program)
0 голосов
/ 08 июля 2011

Переосмыслите вашу проблему / решение.

Когда вы хотите $ (ps ax) - с сохраненными символами новой строки - ОБЫЧНО означает плохой дизайн, и вы, вероятно, хотите использовать каналы или перенаправление. Обычно - так, может быть, это нормально - действительно интересно, чего вы хотите достичь. :)

0 голосов
/ 08 июля 2011

Вы говорите о трубопроводе выходе?Ваш вопрос говорит «труба», но ваш пример - подстановка команд:

ps ax | cat  #Yes, it's useless, but all cats are...

Более полезно?

ps ax | while read ps_line
do
   echo "The line is '$ps_line'"
done

Если вы говорите о подстановке команд вам нужны кавычки, как уже указывали другие, чтобы заставить оболочку не выбрасывать пробелы:

echo "$(ps ax)"
foo="$(ps ax)"
0 голосов
/ 07 июля 2011

Или, если вы хотите иметь построчный доступ:

readarray psoutput < <(ps ax)

# e.g.
for line in "${psoutput[@]}"; do echo -n "$line"; done

Для этого требуется последняя версия (ish) bash

...