큰따옴표 안에 함수를 실행하는 방법은 무엇입니까?

큰따옴표 안에 함수를 실행하는 방법은 무엇입니까?

나는 다음과 같은 기능을 가지고 있습니다 :

#execute vim and then exit on err return
ve() {
    vim "$@" || exit
}
export -f ve

#compile c source -> asm source in new tab in xfce terminal
casm() {
  [ -z ${1} ] && return
  fname=$1
  xfce4-terminal --tab -e "bash -c "\""gcc -S $fname.c; ve $fname.s ;exec bash \""
}
export -f casm

이 경우 ve함수("vim andexit" == "ve")는 두 번째 큰따옴표로 호출됩니다(여기 참조: ) gcc -S $fname.c; ve $fname.s ;exec bash. 문제는 bash가 오류를 발생시키고 bash: ve: command not found( export보시다시피 나중에 알았습니다) 이를 더 명확하게 만들기 위해 무엇을 해야 할지 모르겠습니다.

두 번째 시도에서는 다음을 시도했습니다.

#compile c source -> asm source in new tab in xfce terminal
casm() {
  [ -z ${1} ] && return
  fname=$1
  xfce4-terminal --tab -e "bash -c "\""gcc -S $fname.c; $(ve $fname.s) ;exec bash \""
}
export -f casm

즉, 명령을 하위 쉘로 만들지 만 열려고 하면 -> Vim: Warning: Output is not to a terminal터미널이 충돌합니다. 그렇다면 문제는 어떻게 전역 함수를 큰따옴표로 묶어서 안전하게 만들 수 있느냐는 것입니다.

답변1

첫 번째 솔루션은 내 시스템에서 완벽하게 작동합니다.

다른 시스템에서 테스트해 보세요. 시스템에 문제가 있을 수 있습니다.

두 번째 예에서는 다음을 강제로 vim사용할 수 있습니다 /dev/tty.

ve() {     vim "$@" </dev/tty >/dev/tty || exit; }

답변2

Xubuntu에서 이것을 시도하면 xfce4-terminal이 실제로 새 터미널 창을 실행하기 위해 새 프로세스를 시작하지 않는 것 같습니다. 대신 기존 프로세스를 호출하여 생성합니다. 다른 창에서 시작하는 쉘은 모두 동일한 xfce4 터미널 프로세스의 하위 프로세스입니다.

이는 함수를 전달하는 데 사용된 환경 변수가 첫 번째 쉘(함수를 내보낸 쉘)의 하위 쉘이 아니기 때문에 새 쉘에 전달할 수 없음을 의미합니다. 실행 중인 xfce4-terminal 복사본이 없으면 새 프로세스가 시작되고 환경 변수가 정상적으로 전달됩니다. 또는 예를 들어 xterm을 실행하면 항상 새 프로세스가 생성됩니다.

이는 댓글에 링크된 Kusalananda 질문과 비슷하지만 다릅니다.그래픽 로그인 시 .profile에서 기능을 내보내는 방법하지만 동일한 솔루션이 작동합니다.

~/.bashrc대신, 여기에서 시작된 쉘이 읽어야 하는 함수 정의를 그 안에 넣으십시오 . 그렇지 않은 경우 내부 쉘에서 명시적으로 이 작업을 수행해야 합니다 bash -c '. ~/.bashrc; gcc ...'.


두 번째 스니펫에서:

xfce4-terminal --tab -e "bash -c "\""gcc -S $fname.c; $(ve $fname.s) ;..."

명령 대체는 큰따옴표로 묶여 있으므로 xfce4-terminal이 시작되기 전에 여기에서 확장됩니다. 따라서 올바르게 내보내는지 여부에 관계없이 실행됩니다. 명령 대체 내에서 작동하더라도 컴파일러보다 먼저 실행되기 때문에 원하는 작업을 수행하지 않습니다.

관련 정보