Проблема почти наверняка связана с псевдонимом. Когда вы это сделаете:
/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
И дайте нам знать.
Да, pkcon refresh
использует базовую систему управления пакетами, поэтому в системе Debian она будет обновлять индексы APT (, напримерapt update
).