Здравствуйте, Mamut, Вы писали:
M>1. M>Объясните пару вещей:
Специфицировано башем. В документации даже есть. Элементы, разделённые пробелом, считаются списком. В втором случае у тебя один элемнт. При определении ты говоришь LIST="a b" (без $, кстати), то есть a b (так как " определяют границы), что и подставляется. Во втором случае делаешь "a b", то есть один элемент. Если сделаешь for VAR in "${LIST}" (кстати, можешь просто $LIST), то получишь такой же результат.
M>Почему? Вернее, какого хрена?
M>>1. M>>Объясните пару вещей:
TBG>Специфицировано башем. В документации даже есть.
эээ. да? man bash дает вот это. Там, вроде, нет
TBG>Элементы, разделённые пробелом, считаются списком. В втором случае у тебя один элемнт. При определении ты говоришь LIST="a b" (без $, кстати), то есть a b (так как " определяют границы), что и подставляется. Во втором случае делаешь "a b", то есть один элемент. Если сделаешь for VAR in "${LIST}" (кстати, можешь просто $LIST), то получишь такой же результат.
То есть в одном случае "" означает одно, а в другом — другое? «Удобно», ничего не скажешь. Нет, к этому привыкаешь, не спорю.
M>>Почему? Вернее, какого хрена? TBG>Спецификация.
Имхо, достаточно нелогичная спецификация
M>>2. M>>Почему? Вернее, какого хрена?
TBG>Спецификация.
Аналогично
M>>3. Зачем нужен перевод строки в конце файла в том же кронтабе?
AB>for VAR in a b c de f
AB>do
AB> echo ${VAR}
AB>done
AB>
Но почему?
M>> # правильно M>> VAR=value M>> # неправильно M>> VAR = value M>> Почему? Вернее, какого хрена?
AB>Потому что во втором варианте VAR будет восприниматься как команда (утилита с именем VAR и параметрами = и value)
А вроде есть.
M>эээ. да? man bash дает вот это. Там, вроде, нет
А ты хотел как? Например, в выражении "\"" что должна означать каждая кавычка?
M>То есть в одном случае "" означает одно, а в другом — другое? «Удобно», ничего не скажешь. Нет, к этому привыкаешь, не спорю.
По мне так логичная.
M>Имхо, достаточно нелогичная спецификация
Я в цитировании вверху отвечаю. Там тоже спецификация.
M>А тут?
Ну, как бы кавычки — это не определение строки, а определение неразрывности параметра, чтобы он не парсился как список. Например:
$ svn commit -m Строка с пробелами даст ошибку потому что воспринимается как несколько параметров
$ svn commit -m 'Строка с пробелами в кавычках воспринимается как один параметр'
M> AB>Потому что во втором варианте VAR будет восприниматься как команда (утилита с именем VAR и параметрами = и value) M> Это я понял, но не понимаю логики
Логика такова, что в шелловском скрипте основную массу составляют системные команды и очень мало встроенных конструкций. Например:
#!/bin/sh
STRING=""
if ${STRING}
then
echo "STRING is true"
else
echo "STRING is false"
fi
if [ ${STRING} ]
then
echo "STRING is true"
else
echo "STRING is false"
fi
Дает на первый взгляд парадоксальный результат:
STRING is true
STRING is false
Но все становится на свои места, когда:
STRING="false"
Дает в результате
STRING is false
STRING is true
P.S. символ "[" является алиасом системной утилиты test, ман которого раскроет суть происходящего, false — это тоже системная утилита.
TBG>А вроде есть.
M>>эээ. да? man bash дает вот это. Там, вроде, нет
TBG>А ты хотел как? Например, в выражении "\"" что должна означать каждая кавычка?
Ух. Попробуем еще раз.
Специфицировано башем. В документации даже есть. Элементы, разделённые пробелом, считаются списком.
В документации нет ни про спецификацию, ни про синтаксис присвоения переменных, ни про списки. И да, если мы говорим про спецификацию чего-либо, то она должна обхяснять, что значит каждая кавычка в выражении "\"" (и таки описывает, если продраться сквозь текст)
К спискам можно отнести секцию word splitting, но человеческим тот язык назвать нельзя.
То есть таки да, документация по bashу — не для слабонервных
M>>То есть в одном случае "" означает одно, а в другом — другое? «Удобно», ничего не скажешь. Нет, к этому привыкаешь, не спорю.
TBG>По мне так логичная.
Возможно Я просто программист в первую очередь. И это, мягко гооря, кажется нелогичным
M>>Имхо, достаточно нелогичная спецификация
TBG>Я в цитировании вверху отвечаю. Там тоже спецификация.
Да, но откуда она стала тебе известна — хз
M>>А тут?
M>Объясните пару вещей:
Изначально надо понять, что баш — это не язык программирования. Основная задача любого скрипта на баше — это запуск внешних программ. Следовательно, любой синтаксис башевской операции будет с расчетом на это.
M>Почему? Вернее, какого хрена?
Потому, что "a b" = это один элемент, а b — два. Если бы это было не так, ты бы не мог упаковать список в переменную или не мог бы иметь элементы списка с пробелами.
M># правильно M>VAR=value M>#неправильно M>VAR = value M>Почему? Вернее, какого хрена?
Потому, что a=b это операция присваивания, а =b — это вызов программы а с параметром =b. Почему — см. выше.
M>3. Зачем нужен перевод строки в конце файла в том же кронтабе?
А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки?
V>Потому, что a=b это операция присваивания, а =b — это вызов программы а с параметром =b. Почему — см. выше.
Черт, не получается войны по этим пунктам
M>>3. Зачем нужен перевод строки в конце файла в том же кронтабе? V>А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки?
Здравствуйте, Mamut, Вы писали:
V>>А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки? M>По какому стандарту?
По определению.
Текстовый файл -- файл, состоящий из строк.
Строка -- последовательность символов, завершенная переводом строки.
Делаем вывод, что текстовый файл завершается переводом строки.
Здравствуйте, Vamp, Вы писали:
M>>3. Зачем нужен перевод строки в конце файла в том же кронтабе? V>А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки?
V>>>А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки? M>>По какому стандарту?
KDK>По определению. KDK>Текстовый файл -- файл, состоящий из строк. KDK>Строка -- последовательность символов, завершенная переводом строки. KDK>Делаем вывод, что текстовый файл завершается переводом строки.
С чего это вдруг? По определению он может заканчиваться переводом строки (каким из них, кстати?) или EOF. Вполне логично
V>>А это вообще по стандарту. Ты знаешь, что по стандарту текстовый файл обязан кончаться переводом строки? M>По какому стандарту?
См, например, здесь:
The C language standard says A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character.
This is in section 2.1.1.2 of the ANSI C 1989 standard. Section 5.1.1.2 of the ISO C 1999 standard (and probably also the ISO C 1990 standard).
Здравствуйте, Mamut, Вы писали:
KDK>>По определению. KDK>>Текстовый файл -- файл, состоящий из строк. KDK>>Строка -- последовательность символов, завершенная переводом строки. KDK>>Делаем вывод, что текстовый файл завершается переводом строки. M>С чего это вдруг? По определению он может заканчиваться переводом строки (каким из них, кстати?) или EOF. Вполне логично
Согласно секции Definitions стандарта IEEE Std 1003.1-2008
3.205 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
3.395 Text File
A file that contains characters organized into zero or more lines.
3.238 Newline Character (<newline>)
A character that in the output stream indicates that printing should start at the beginning of the next line. It is the character designated by '\n' in the C language.
V>The C language standard says A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character.
V>This is in section 2.1.1.2 of the ANSI C 1989 standard. Section 5.1.1.2 of the ISO C 1999 standard (and probably also the ISO C 1990 standard).
Оттуда мне больше нравится вариант
This originates from the very early days when simple terminals were used. The newline char was used to trigger a 'flush' of the transferred data.
Тем более, что цитата про C++ относится только к source файлам С++. И то, судя по комментариям, тому же gcc на это наплевать (и правильно).