Я просто задаюсь вопросом различие, вызывающее функцию между $(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
Вопреки тому, как получают доступ к переменным, функции вызываются по имени, не предшествуя имени с '$'.
Вы могли бы быть смущены тем, как на командной строке, можно определить функцию и вызвать ту функцию по имени, но в PS1 необходимо было поместить команду в круглую скобку, которой предшествует '\$ '. Включение имени функции в '$ (' и')' заставляет весь '$ (функция)' быть замененным тем, что стандартный вывод той функции. Помещение обратной косой черты перед этим заставляет Вашу оболочку оценивать/выполнять ту функцию каждый раз, когда это хочет произвести $PS1. Если бы Вы бросили обратную косую черту, то функция была бы вызвана только однажды при первом определении PS1, и независимо от того, что вывод функции был то, что в первый раз, навсегда будет в подсказке PS1 с тех пор.
Когда Вы вызываете $(one_func)
, это выполнит функцию и возвратит вывод. Таким образом, если Вы говорите, например:
var=$(ls)
это сохранит вывод ls
команда (т.е. список файлов в текущем каталоге) в переменную $var
. В то время как команда:
var=ls
просто установит значение $var
к "ls".
Между прочим, вызывание функции в ударе работает тот же путь выполнением команды.
Только добавить к вышеупомянутому. очень полезная информация... та же идея применяется когда вложенные функции и вызов исполняемых файлов...
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, МБ, ГБ, и т.д.