Использование команды в эхе дает другой результат

Я запускаю следующие команды во FreeBSD:

$ cat filename | tr '\t' '\n'
#Output
DOCS     : ON

NLS      : ON

RCSI     : ON

$ echo `cat filename | tr '\t' '\n'`
#Output
DOCS     : ON NLS      : ON RCSI     : ON

Почему эхо не отображается так же, как фактический вывод команды? Что-то не так с синтаксисом в эхе?


person user6360694    schedule 07.02.2017    source источник
comment
Если вы используете csh, четко укажите это в своем вопросе и добавьте соответствующий тег.   -  person mklement0    schedule 08.02.2017


Ответы (5)


В отличие от sh/ksh, оболочка C всегда будет преобразовывать новые строки, вы либо избегаете использования расширения команды, либо решаете проблему с помощью некоторого экранирующего кода + подстановки на стороне csh.

person Ismael Luceno    schedule 08.02.2017

Для оболочки csh, оболочка по умолчанию на freebsd:

От ответа @mateusz-piotrowski и @ismael-luceno: вы не можете, вам нужна другая оболочка. Изменить глобально с помощью:

chsh -s /usr/local/bin/bash

или просто добавьте вверху скрипта:

#!/usr/local/bin/bash

Для оболочки по умолчанию на freebsd:

Вам нужно добавить кавычки в свою подкоманду:

echo "`cat filename | tr '\t' '\n'`"

Это связано с тем, что bash заменяет \n пробелом при передаче аргументов командам, когда он не заключен в кавычки.

person izissise    schedule 07.02.2017
comment
Во FreeBSD отображается сообщение об ошибке с недопустимым именем переменной. - person user6360694; 07.02.2017
comment
Какую оболочку вы используете?, echo $SHELL - person izissise; 07.02.2017
comment
echo $SHELL дает мне /bin/csh - person user6360694; 07.02.2017
comment
unix.stackexchange.com/a/284226 Кто-то добавляет ту же проблему. Кажется, вам нужно установить переменную, а затем эхо: set var = "`cat filename | tr '\t' '\n'`"; echo "$var"; - person izissise; 07.02.2017
comment
Не повезло, тот же результат :( - person user6360694; 07.02.2017
comment
Вы можете использовать bash вместо csh, просто поместите '#!/bin/bash' поверх вашего скрипта. - person izissise; 07.02.2017
comment
@izissise bash отсутствует в базовой системе FreeBSD. Вы должны установить его. Кроме того, я не уверен, находится ли он в /bin/bash - комментарий здесь предлагает /usr/local/bin/bash. Другой вариант — просто использовать /bin/sh. - person Mateusz Piotrowski; 09.02.2017

Вы должны использовать

foreach line (`cat a | tr '\t' '\n'`")
  echo $line
end
person Thepro    schedule 09.02.2017

Похоже, что самый простой способ решить эту проблему - изменить вашу оболочку на /bin/sh, что должно подойти вам, если вы знакомы с Bash.

Чтобы изменить вашу оболочку, выполните:

chsh -s /usr/local/bin/bash

В качестве альтернативы вы можете просто ввести sh в свой терминал и наслаждаться интерактивным сеансом в /bin/sh.

Если вы действительно хотите использовать Bash, вот тема, которая может оказаться полезной: Как Установите bash на FreeBSD

В качестве примечания: не рекомендуется постоянно менять оболочку root в FreeBSD.

person Mateusz Piotrowski    schedule 08.02.2017

person    schedule
comment
Не работает на FreeBSD. Результат тот же, отображается в одну строку. - person user6360694; 07.02.2017