2017-10-25 1 views
2

저는 vim을 사용합니다 :! 외부 명령 함수는 항상 쉘 명령의 인수로 %를 제공합니다. 예 :vim 외부 명령을 사용하여 bash 함수를 호출하십시오.

:!psql -f % 

또한 필자가 사용하는 .bashrc에는 많은 bash 쉘 기능이 있습니다. 예 :

psql-h1() 
{ 
    /usr/bin/psql -hh1 -d mydb "[email protected]" 
} 

이러한 bash 기능은 다음에서 사용할 수 없습니다. 정력의 내부. 그 (것)들을 이용할 수있게하는 방법 있는가?

+0

vim 내부에서 'bash'를 사용하고 있습니까? ':! echo $ 0'이'bash'를 출력합니까? – hnefatl

+0

두 가지 해결 방법 : 1.': help 'shellcmdflag'' 2. 함수를 실제 스크립트로 바꾸고'$ PATH'에 넣으십시오. – romainl

답변

2

함수를 내 보냅니다. 즉 :

psql-h1() { /usr/bin/psql -hh1 -d mydb "[email protected]"; } 

export -f psql-h1 ### <-- THIS RIGHT HERE 

이것은 자식 프로세스, 그것은 비 대화식 쉘 등 .bashrc를 읽을 수없는 경우에도 같은 bash는 실행의 사본에이를 사용할 수 있습니다.

+0

빙고. 바로 여기. ENV 변수를 하위 프로세스로 내보냈다는 것을 알고있었습니다. bash 기능에 대해 전혀 몰랐습니다. – Jeremy

+0

기본적으로 같은 것입니다. 즉, 내 보낸 함수는 특이한 이름과 함수의 코드를 값으로 갖는 내 보낸 변수입니다. bash는 환경과 일치하는 이름을 찾기 위해 환경을 스캔하고 코드로 구문 분석합니다. 양날의 칼, 그 특징 - 그것은 쉘 쇼크의 원인이었습니다. –

0

이 대답은 vim이 실제로 bash을 사용하여 원격 명령을 호출하지 않는다고 가정합니다. :!echo $0vim에 실행하여 테스트 할 수 있습니다.

는 특히 vim에 대한 추가

set shell=/bin/bash 

당신의 .vimrc에. 예에서

export SHELL=/bin/bash 

: 일반적으로


는 두 개의 다른 프로그램 내 선호하는 쉘을 호출려고 할 때 가끔 일에 발견 한 전략이있다. .profile 파일 또는 :

대신 bash를 가리 키도록 sh 심볼릭 링크를 업데이트
ln -fsn /bin/bash /bin/sh 

.

많은 시스템 (확실히 우분투)에서

, /bin/shsh 호환 쉘 (예 bash)보다는 sh 쉘 자체 심볼릭 링크이다. 이 사실을 감안할 때, 일부 프로그램 (나는 GHC에서이 동작을 보았습니다)은 /bin/sh을 호출하는 것으로 보이므로 어디를 가리키는 지 변경하면 프로그램에서 bash을 대신 사용하게됩니다.

+0

쉘이 bash인지 확인해야하지만 충분하지는 않습니다. 대화식 플래그가없는 bash (즉, [[$ - = * i *]]가 참이 아닌)는 '.bashrc '를 읽는다. –

+0

또한'/ bin/sh'을 bash에 연결하지 않는다면 '은 '이 호출 될 때 bash 구문을 얻는다는 것을 의미합니다. bash 실행 파일은 해당 이름으로 호출 될 때 POSIX 호환 모드로 실행됩니다. 일부 확장 프로그램은 여전히 ​​해당 모드에서 작동하지만, 그 중 일부는 해당 모드에서 작동하지 않습니다. –

1

(빔이 아닌 배쉬 사이에서 쉘 거기 아니 도달 할 수있다, 이러한 경우에 대한 here 참조)이 당신의 기능을 수출하는 대신, 당신은 빔이 대화 형 쉘을 시작하도록 지시 할 수 없다 당신의 .bashrc을되도록 읽습니다. :help 'shellcmdflag'을 통해 -i 플래그를 Bash에 전달하면됩니다.

:set shcf=-ic 
관련 문제