Расширение переменной оболочки и эффект шарика и разделения на нем

Я работаю Debian Хрипящий (32-разрядный) с драйверами NVIDIA. Я также недавно попробовал версию DKMS 320.17, но вернулся 'Чиновнику' сборка NVIDIA (295.59), не потому что ей не удалось установить, но потому что она не включает nvidia-settings программа и я должны сбросить сверхсканирование на моем телевидении с высокой четкостью (дополнительный монитор).

Однако Вы не должны должны быть связываться /usr/bin/gcc к gcc-4.6 для выполнения более старой версии. Я просто выполнился CC=gcc-4.6 прежде, чем выполнить 'Официальные' 295,59 установок после того, как я произвел чистку всего материала Nvidia это apt-get установил.

Хрипящий все еще версия тестирования, таким образом, возможно, что Вы поразили ошибку, которая не была правильно протестирована в 64-разрядной сборке. Как я сказал, мое 32-разрядное обновление не показало проблемы кроме недостающей функциональности. Вы могли бы хотеть посмотреть на вход отчета об ошибках, если Вы уверены, что все в порядке в Вашей системе.

Моя рекомендация состояла бы в том, чтобы вернуться к 295,59 'Официальным' версиям (или использование Вашей ссылки или определение CC для использования правильной версии gcc) и затем ожидать обновления nvidia-kernel-dkms модуля (или до Хрипящий выпуск как стабильный).

Конечно, если Вы проверите здесь, то Вы будете видеть, что код является Небесплатным так или иначе, таким образом, он, вероятно, использует предварительную версию 'Официального' двоичного файла, который просто добавил бы к возможностям проблем.

18
13.04.2017, 15:36
2 ответа

Переменное расширение (стандартный термин является расширением параметра, и это также иногда звонило, подстановка переменных) в основном означает заменять переменную ее значением. Более точно это означает заменять $VARIABLE создайте (или ${VARIABLE} или ${VARIABLE#TEXT} или другие конструкции) некоторым другим текстом, который создается из значения переменной. Этот другой текст является расширением переменной.

Процесс расширения идет следующим образом. (Я только обсуждаю общий падеж, некоторые настройки оболочки и расширения изменяют поведение.)

  1. Примите значение переменной, которая является строкой. Если переменная не определяется, используйте пустую строку.
  2. Если конструкция включает преобразование, примените ее. Например, если конструкция ${VARIABLE#TEXT}, и значение переменной начинается TEXT, удалить TEXT с начала значения.
  3. Если контекст призывает к отдельному слову (например, в двойных кавычках, или в правой стороне присвоения, или в здесь документ), остановитесь здесь. Иначе продолжите следующие шаги.
  4. Разделите значение на отдельные слова в каждой последовательности пробела. (Переменная IFS может быть изменен для разделения в символах кроме пробела.) Результатом не является таким образом больше строка, но список строк. Этот список может быть пустым, если значение содержало только пробел.
  5. Рассматривайте каждый элемент списка как подстановочный шаблон имени файла, т.е. шарик. Если шаблон соответствует некоторым файлам, это - замены списком соответствия именам файлов, иначе это оставлено в покое.

Например, предположите что переменная foo содержит a* b* c* и текущий каталог содержит файлы bar, baz и paz. Затем ${foo#??} расширен следующим образом:

  1. Значение переменной является 8 символьными строками a* b* c*.
  2. #?? средства снимают изоляцию с первых двух символов, приводящих к 6 символьным строкам  b* c* (с начальным пространством).
  3. Если расширение находится в контексте списка (т.е. не в двойных кавычках или другом подобном контексте), продолжить.
  4. Разделите строку на разграниченные пробелом слова, приводящие к списку двух строк: b* и c*.
  5. Строка b*, интерпретируемый как шаблон, соответствует двум файлам: bar и baz. Строка c* соответствия никакой файл, таким образом, это оставлено в покое. Результатом является список трех строк: bar, baz, c*.

Например, echo ${foo#??} печать bar baz c* (команда echo присоединяется к его спорам с промежуточным пространством).

Для получения дополнительной информации см.:

15
27.01.2020, 19:46
  • 1
    Обратите внимание, что это назвало p̲a̲r̲a̲m̲e̲t̲e̲r ̲ расширением, потому что это относится к переменным ($var) и другие типы параметров как $1, $#, $?, $-... $var1 –  Stéphane Chazelas 17.12.2014, 13:09

шарик/разделение

Я возьму шарик/разделение сначала. ответ @Stephane, с которым Вы связались, использует те термины в общем смысле. Они не фактические команды или что-либо как этот, просто псевдо операции.

split("$test") разделил бы содержание "$test" в "массив" элементов.

glob(...) затем заботился бы для расширения любого из этих элементов, которые содержат оболочку globbing символы такой как * или диапазоны [1-2].

Пример

Скажите нашу строку $test следующие.

$ test="afile[1-2] afile[3-5]"

Также скажем, у нас есть каталог с некоторыми файлами в нем.

$ ls -1
afile1
afile2
afile3
afile4
afile5

Теперь, если мы пытаемся повторить его без кавычек, необходимо заметить, что наша строка разбудила разделение на пробелах, и затем любые globbing символы были расширены.

$ echo $test
afile1 afile2 afile3 afile4 afile5

Однако, если мы должны были заключить переменную в кавычки, когда мы передали ее как аргумент echo мы получили бы исходную литеральную строку.

$ echo "$test"
afile[1-2] afile[3-5]

переменное расширение

Расширение переменной термина предназначено для покрытия основной операции, которой оболочка работает как часть, он - основные операции. Оболочка ответственна за парсинг входа и затем выполнение этого входа, после того как это считают синтаксически корректным.

В нашем предыдущем примере. Когда переменная $test был представлен echo закрывший кавычки мы говорили оболочке идти вперед и разделять те аргументы и затем шарик их.

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

Пример

Вот некоторые дополнительные примеры globbing и разделения.

шарик/разделение происходит автоматически

$ echo file{1..3}
file1 file2 file3

$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb

$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD

$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC

шарик/разделение отключен через двойное заключение в кавычки

$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC

$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}
12
27.01.2020, 19:46
  • 1
    я не знал диапазоны также, работал в обратном порядке. подсказка оптимизации –  Joe 13.01.2018, 07:53

Теги

Похожие вопросы