Будет ли «pkcon refresh» запускать что-то вроде «apt update» в Debian?

Проблема почти наверняка связана с псевдонимом. Когда вы это сделаете:

/bin/bash somefile

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

Псевдонимы странные.Псевдонимы - это расширения синтаксического анализатора - это самый первый тип расширяемых объектов, поддерживаемых большинством оболочек, и они расширяются способами, которых многие не ожидают. bash , по сути, препятствует их использованию - по какой-либо причине - путем отключения псевдонима расширений по умолчанию в любой неинтерактивной оболочке. И поэтому, если псевдоним вызывает эту ошибку - а я почти уверен, что проблема в этом - то даже поиск файлов среды, скорее всего, все равно не вызовет такой же вывод ошибки при использовании / bin / bash .

Когда я говорю, что псевдонимы странные, это потому, что они расширяются на другом уровне, чем другие типы расширений оболочки. Вероятно, это наиболее очевидно в контексте определения функции; при этом расширения оболочки не происходят - поскольку они зарезервированы для последующего выполнения функции - , за исключением псевдонимов , без двойной оценки выражения. И псевдонимы никогда не раскрываются во время выполнения функции (опять же, за исключением eval ) , потому что они уже были расширился во время его определения.

Вот пример:

alias a='echo not a;b'
b(){ echo a\?; }; a(){ echo le sigh...; }
a; b

... печатает ...

not a
not a
le sigh...
le sigh...

Первый раз псевдоним с именем a раскрывается, когда я это делаю:

a(){...

Это возможно, потому что парены () являются токенами оболочки, а не зарезервированными словами, такими как {} , и поэтому они могут ограничивать слово без пробелов, что делает их особенно полезными для таких вещей, как функции и объявления массивов, поскольку синтаксический анализатор выполняет раскрытие макроса для получения исполняемого оператора.Результатом вышеупомянутого расширения является ...

}; echo not a;b(){ 

При последнем расширении преобразуется:

a; b

... в ...

echo not a;b; b

Видите ли, типичные расширения оболочки происходят в предварительно ограниченном контексте - они ограничены со всех сторон управляющими операторами, такими как:

\n[]{}|&();<>\'"`

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

Я предполагаю, что у вас есть псевдоним , объявленный для func - это было бы наиболее простое объяснение - но поскольку псевдонимы могут связываться, если они определены с конечным пробелом - и также будет расширено в определение функции - нет никакого способа узнать наверняка, учитывая только предоставленную вами информацию. Но я думаю, что смогу воспроизвести вашу ошибку. Это близко:

alias func='func('
func(){
    local a b=()
    echo $0
}
func

... который печатает ...

bash: syntax error near unexpected token `('
bash: local: can only be used in a function
bash
bash: syntax error near unexpected token `}'
bash: syntax error near unexpected token `newline'

Так что просто сделайте:

alias func local a b echo

И дайте нам знать.

1
22.04.2018, 19:38
1 ответ

Да, pkcon refreshиспользует базовую систему управления пакетами, поэтому в системе Debian она будет обновлять индексы APT (, напримерapt update).

3
27.01.2020, 23:43

Теги

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