Не удается импортировать некоторые простые функции в bash после установки -a?

Если вы не уверены, содержит ли файл спецификацию UTF -8, тогда это (предполагает, что реализация GNUsed)удалит спецификацию, если она существует, или не внесет никаких изменений, если она не существует. т.

sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt

Вы также можете перезаписать существующий файл с помощью опции -i:

sed -i '1s/^\xEF\xBB\xBF//' orig.txt

Если вы используете BSD-версию sed(, например macOS ), вам нужно, чтобы bash выполнял экранирование:

 sed $'1s/\xef\xbb\xbf//' < orig.txt > new.txt
1
15.10.2020, 22:41
1 ответ

Сset -a(акаset -o allexport)bashэкспортирует все функции , объявленные после этого, в дополнение к переменным.

Ошибка указывает на то, что bashне может импортировать функцию с именем /users/avnamn/bin/pricer, а не pricer.

Скорее всего, перед запуском source./variables.shвы запускали (, возможно, в одном из файлов запуска):

alias pricer=/users/avnamn/bin/pricer

Итак, когда sourceчитать:

pricer() { "/users/avnamn/bin/pricer" "$@" ; }

Он был преобразован расширением псевдонима в:

/users/avnamn/bin/pricer() { "/users/avnamn/bin/pricer" "$@" ; }

(который, кстати, создает функцию, которая рекурсивно вызывает себя ).

Вы можете определить функцию с таким именем в bash, но bashне позволит вам экспортировать ее. Если вы попытаетесь export -f /users/avnamn/bin/pricer, bashсообщит:

bash: line <n>: export: /users/avnamn/bin/pricer: cannot export

Еще с allexport,функция тем не менее экспортируется (, что, как вы можете утверждать, является ошибкой ), но последующие bashоболочки, запущенные в этой среде, откажутся импортировать ее, поэтому сообщение, которое вы получите при запуске ./script.sh, который запускает новый bashвызов.

Функция экспорта функций bash очень опасна (, особенно в системах, где shравно bash! ), его следует использовать с осторожностью.

Функция allexportтакже довольно опасна (, особенно в bash, которая также экспортирует функции )и то, что вы не хотели бы делать в интерактивной оболочке.

Здесь, если вы хотите экспортировать ряд переменных в среду без явного вызова export, я рекомендую вам сделать:

set -o allexport
  A=1
  B=2
 ...
set +o allexport

(и убедитесь, что вы не объявляете функции в этом разделе кода ).

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

4
18.03.2021, 22:57

Теги

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