메인 셸에서 명령 블록을 실행하는 방법은 무엇입니까?

메인 셸에서 명령 블록을 실행하는 방법은 무엇입니까?

나는 메인 셸 내에서 일련의 명령을 전체적으로 실행하려고 시도하지만 제가 배운 방식은 하위 셸 내부에서만 작동합니다.

답변1

당신이 무엇을 의미하는지에 따라 달라집니다전체적으로.

여러 명령을 셸에 보내고 해당 명령을 모두 입력할 때까지 셸에서 해당 명령을 실행하지 않도록 하려면 다음을 수행하면 됩니다.

cmd1; cmd2

또는

cmd1 Ctrl+VCtrl+Jcmd2

(또는 대괄호 붙여넣기( bind 'set enable-bracketed-paste on')를 활성화하고 대괄호 붙여넣기를 지원하는 터미널에서 명령을 붙여넣습니다.)

또는:

{
cmd1
cmd2
}

여러 줄에 표시합니다.

예를 들어 동일한 stdin 또는 stdout을 공유하도록 그룹화하려면 다음을 사용할 수 있습니다.

{ cmd1; cmd2; } < in > out

또는

eval 'cmd1; cmd2' < in > out

bash익명 함수 와 동등한 기능이 없기 때문에 자체 변수 및 옵션 범위로 실행하려면 zsh임시 함수를 정의해야 합니다.

f() { local var; var=foo; bar;}; f

답변2

서브셸에서 ( something )시작되는 대신 현재 셸에서 시작되는 를 사용하세요.something{ something ; }something

뒤에 공백이 필요 {하고 ;앞에도 (또는 개행)이 있어야 합니다 }.

전:

$ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; }
hello 3536
hello again 3536

그러나 일부 복잡한 명령(또는 파이프된 명령)을 실행하는 경우 해당 명령은 대부분의 경우 서브셸에 있게 됩니다.

그리고 현재 쉘의 pid를 얻는 "이식 가능한" 방법은 $$.

따라서 대신 테스트를 다음과 같이 작성하겠습니다.

{ echo "hello $$"; sleep 5 ; echo "hello again $$" ; }

(어쨌든 여기서는 잠이 별로 유용하지 않습니다)

관련 정보