LINUX.ORG.RU

Убрать парсинг обратного слеша в шелл-функции read

 , ,


0

1
( echo "q\\"; echo "w" ) | ( read x; echo "$x" )

Выводит qw. Как сделать чтобы обратный слэш прочитался как просто символ, а следующий за ним перевод строки - как конец ввода (как было бы если б не слэш)?

В sh и в bash одинаково съедает слэш, вероятно это posix-поведение.

На всякий случай, а то вдруг кто неправильно поймёт вопрос: менять ввод нельзя, вопрос в том есть ли какие-то опции шеллу чтобы он начать правильно парсить именно такой ввод.

★★★★★

Последнее исправление: firkax (всего исправлений: 3)

Верное решение уже было предложено, поэтому моя очередь предложить альтернативное решение:

( echo "q\\"; echo "w" ) | ( x="$(awk '{print;exit}')"; echo -n "$x" )
kaldeon ★★
()
Ответ на: комментарий от firkax

Выше уже указали решение.

Я против него ничего не имею. Просто с одинарными кавычками тот же результат:

 ~ $ ( echo "q\\"; echo "w" ) | ( read x; echo "$x" )
qw
 ~ $ ( echo 'q\\'; echo "w" ) | ( read x; echo "$x" )
q\
 ~ $ ( echo "q\\"; echo "w" ) | ( read -r x; echo "$x" )
q\
dmitry237 ★★★★★
()
Последнее исправление: dmitry237 (всего исправлений: 1)
Ответ на: комментарий от dmitry237

Это и есть «менять ввод». Дело не в кавычках, просто

echo "q\\"
печатает
q\
, а
echo 'q\\'
печатает
q\\
- двойной слэш, и read точно так же съедает первый.

firkax ★★★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария