Как я могу вызвать функцию в сценарии оболочки удара

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

Когда я установил переменную PS1 в ~/.bashrc, Я не могу вызвать функцию one_func исключая:

export PS1="\n\[\e[31m\] \$(one_func)  # it works 

export PS1="\n\[\e[31m\] one_func      # it doesn't work
4
задан 27.12.2015, 01:54

3 ответа

Вопреки тому, как получают доступ к переменным, функции вызываются по имени, не предшествуя имени с '$'.

Вы могли бы быть смущены тем, как на командной строке, можно определить функцию и вызвать ту функцию по имени, но в PS1 необходимо было поместить команду в круглую скобку, которой предшествует '\$ '. Включение имени функции в '$ (' и')' заставляет весь '$ (функция)' быть замененным тем, что стандартный вывод той функции. Помещение обратной косой черты перед этим заставляет Вашу оболочку оценивать/выполнять ту функцию каждый раз, когда это хочет произвести $PS1. Если бы Вы бросили обратную косую черту, то функция была бы вызвана только однажды при первом определении PS1, и независимо от того, что вывод функции был то, что в первый раз, навсегда будет в подсказке PS1 с тех пор.

5
ответ дан 07.12.2019, 20:10

Когда Вы вызываете $(one_func), это выполнит функцию и возвратит вывод. Таким образом, если Вы говорите, например:

var=$(ls)

это сохранит вывод ls команда (т.е. список файлов в текущем каталоге) в переменную $var. В то время как команда:

var=ls

просто установит значение $var к "ls".

Между прочим, вызывание функции в ударе работает тот же путь выполнением команды.

1
ответ дан 07.12.2019, 20:10

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

PS1="# \e[1;30m\u\e[0;37m@\h: \e[1;31m\w\e[31m >\e[1;30m  \t \e[1;33m [ \$(kmg \$(totalfilesize.sh)) ]\e[m\n"

"kmg" является функцией удара, которую я определил, и с этим синтаксисом передается аргумент от вывода "totalfilesize.sh" сценария

\$(kmg \$(totalfilesize.sh))

Если Вам любопытно, totalfilesize вычисляет размер файлов в текущем каталоге, и kmg преобразовывает строку (в байтах) к человекочитаемому b, МБ, ГБ, и т.д.

0
ответ дан 07.12.2019, 20:10

Теги

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