4

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

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

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

export PS1="\n\[\e[31m\] one_func      # it doesn't work

3 ответа3

5

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

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

1

Когда вы вызываете $(one_func) , он выполняет функцию и возвращает результат. Так что если вы скажете, например:

var=$(ls)

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

var=ls

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

Кстати, вызов функции в bash работает так же, как и выполнение команды.

0

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

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 - это функция bash, которую я определил, и с этим синтаксисом передается аргумент из выходных данных скрипта totalfilesize.sh

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .