Ответ 1
Чтобы добавить строку export -f add
в файл .bashrc.
add(){
echo $(expr $1 + $2)
}
export -f add
Теперь source .bashrc
, каждый метод может вызвать функцию add из .bashrc правильно.
Среда: debian9 + vim7.4.
cat .bashrc
add(){
echo $(expr $1 + $2)
}
Теперь отредактируйте файл в vim
add 1 5
Запустите его в командном режиме :w !bash
, произойдет ошибка.
bash: line 1: add: command not found
shell returned 127
1.add set shellcmdflag=-ic
в обоих файлах /etc/vim/vimrc и .bashrc и .vimrc.
2.reboot
3.vim test.sh
войти в командный режим
: verbose set shellcmdflag
shellcmdflag=-ic
Last set from ~/.vimrc
4.Введите две строки в test.sh
ls
add 5 6
:w !bash
a1.sh test.py
bash: line 2: add: command not found
shell returned 127
Как сделать обе две строки выполнены?
:execute '! source ~/.bashrc; source '.expand('%:p')
может выполнять обе команды: ls
и add
.
После перезагрузки,
Функция 1.add не может быть вызвана из sh test.sh
?
sh test.sh
test.sh #it means that ls command executed
test.sh: 2: test.sh: add: not found #it means that add function can't be called from /etc/vim/vimrc or .bashrc or .vimrc.
Функция 2.add не может быть вызвана из vim !bash %
?
test.sh #it means that ls command executed
test.sh: line 2: add: command not found #it means that add function can't be called from /etc/vim/vimrc or .bashrc or .vimrc.
[4]+ Stopped vim test.sh
Чтобы добавить строку export -f add
в файл .bashrc.
add(){
echo $(expr $1 + $2)
}
export -f add
Теперь source .bashrc
, каждый метод может вызвать функцию add из .bashrc правильно.
Проблема заключается в том, что Vim по умолчанию вызывает неинтерактивную оболочку, а .bashrc
(где вы определили функцию add
) читается только для интерактивных оболочек.
Вы можете проинструктировать Vim использовать интерактивную оболочку:
:set shellcmdflag=-ic
Это может сделать внешние вызовы команд медленнее (из-за накладных расходов при оценке инициализации Bash).
В качестве альтернативы вы можете определить функцию где-то еще, поэтому она всегда доступна (но там нет простого места, см. раздел man bash
, esp. the INVOCATION
). Или превратите функцию в отдельный script, доступный из вашего PATH (например, ~/bin/add
).
Проблема заключается в том, что ваша функция ограничена интерактивной оболочкой для ее выполнения. Вам нужно сделать это
:!bash -ic "add 1 2"
Я полагаю, это должно решить это для вас. Это скорее обходное решение, чем объяснение вашей проблемы, но оно выполняет свою работу.
:execute '! source ~/.bashrc; source '.expand('%:p')
Я просто рушаю bashrc перед вызовом команды. Одним из возможных объяснений вашей проблемы является то, что вы находитесь на mac. Насколько я знаю, OSX не используют bashrc, они действительно используют bash_profile.
Как выполнить обе две строки?
ls
add 5 6
Это также работает (с shellcmdflag=-ic
или shellcmdflag=-c
):
:w !bash -i
При таком подходе нет необходимости включать export -f add
в .bashrc
.
Почему добавить функцию нельзя из vim с помощью
!bash %
?
Предполагая, что у вас есть флаги shellcmdflag=-c
, вы можете сделать:
:!bash -i ./%
что очень похоже на ответ exe.