echo -e работает в терминале, но не в скрипте bash

bash shell

9929 просмотра

2 ответа

Я разработал и поддерживаю рубиновый гем под названием Githug и пытаюсь написать для него автоматический тестовый скрипт. Githug в основном манипулирует каталогом, чтобы поместить его в различные состояния рабочего репозитория git, и вы можете выполнять команды git, чтобы «решить» уровень.

Один из уровней запрашивает у вас информацию о git config, и я делаю следующее:

#! /bin/sh
# ...snip
#level 4
FULL_NAME=$(git config --get user.name)
EMAIL=$(git config --get user.email)
echo -e "$FULL_NAME\n$EMAIL" | githug

Когда я выполняю из bash-скрипта, он (echo -e) не работает. Но это происходит, когда я запускаю его из терминала.

FULL_NAME=$(git config --get user.name)
EMAIL=$(git config --get user.email)
echo -e "$FULL_NAME\n$EMAIL" | githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is your name? What is your email?
Congratulations, you have solved the level

Почему это не работает из скрипта bash?

Благодарю.

Автор: Gazler Источник Размещён: 12.11.2019 09:16

Ответы (2)


14 плюса

Решение

Неправильный Шебанг:

#! /bin/sh

Когда это будет скрипт bash, используйте

#! /bin/bash

Bash имеет встроенное эхо, которое не на 100% идентично / bin / echo.

Автор: user unknown Размещён: 22.04.2012 12:19

0 плюса

Как прокомментировано, printfэто предпочтительный вариант , как показано в Git 2.14.x / 2.15 (4 квартал 2017 г.)

printf '%s\n%s' "$FULL_NAME" "$EMAIL"

См. Коммит 1a6d468 (17 сентября 2017 г.) от Torsten Bögershausen ( tboegi) .
(Объединено Торстеном Бёгерсхаузеном - tboegi- в коммите 1a6d468 , 21 сентября 2017 г.)

test-lint: echo -e(или -E) не переносимый

Некоторые реализации echoподдерживают -eопцию ' ', чтобы включить интерпретацию обратной косой черты следующей строки.
Кроме того, они поддерживают « -E», чтобы отключить его.

Тем не менее, ни один из них не является переносимым, POSIX даже не упоминает их, и многие реализации не поддерживают их.

Проверка на ' -n' уже выполнена check-non-portable-shell.pl, расширьте ее, чтобы охватить ' -n', ' -e' или ' -E'.

Автор: VonC Размещён: 28.09.2017 08:01
Вопросы из категории :
32x32