Bash bug re $ LINENO-- или я просто запутался? - PullRequest
7 голосов
/ 15 июня 2011

Рассмотрим:

#!/bin/bash

echo '
' $LINENO
echo '' '
'  $LINENO

Первый эхо правильно печатает 4, но второй эхо печатает 5 вместо 6. Я что-то упустил, или это ошибка? (С использованием bash 3.00.15)

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Это похоже на ошибку реализации (ошибку) в bash.

Я использовал:

#!/bin/bash -p
echo $LINENO
echo ' ' $LINENO '
' $LINENO '
' $LINENO
echo '' '
'  $LINENO

, что привело к:

2
  3 
 3 
 3

 6

Что поддерживает теорию, чтопеременная оценивается до того, как оболочка посчитает, что строка завершена.После завершения строки обновляется LINENO и продолжается.

Проверенные версии Bash: 3.2.48 (mac), 4.1.5 (linux)

Когда я использую синтаксис:

echo '
' $LINENO

он получает более новый номер строки.Похоже, это связано с вычислением пустой строки, представленной в качестве единственного аргумента в строке.

2 голосов
/ 31 марта 2013

Bash, по-видимому, интерпретирует многострочный и многострочный аргумент для команды echo только в одной строке файла (сценария) исходного кода, поскольку Bash должен объединять многострочный & многострочный аргумент команды echo в один (однострочный) аргумент. Механизм конкатенации также запускается пустой строкой '', за которой следует строка, содержащая символ новой строки echo -e '' + '\n' + $LINENO.

#!/bin/bash
# Bash concatenates a multi-string & multi-line argument ...
echo ' ' $LINENO '
' $LINENO '
' $LINENO

# ... into a one line argument.
echo -e "' ' $LINENO '\n' $LINENO '\n' $LINENO\n"

#!/bin/bash
echo "2
3
4
5
6 LINENO: $LINENO"   # 6 LINENO: 6
exit

#!/bin/bash
echo "2" " " "
3
4
5
6 LINENO: $LINENO"   # 6 LINENO: 2
# echo -e "2" + " " + "\n3\n4\n5\n6 LINENO: $LINENO"
exit
...