전체적으로 메인 셸 내에서 일련의 명령을 실행해 보았지만 배운 방법은 하위 셸에서만 작동합니다.
답변1
당신이 무엇을 의미하는지에 따라 달라집니다전체적으로.
여러 명령을 셸에 보내고 해당 명령을 모두 입력할 때까지 셸에서 명령 실행을 시작하지 않으려면 다음을 수행할 수 있습니다.
cmd1; cmd2
또는
명령 1 Ctrl+VCtrl+J명령 2
(또는 대괄호 붙여넣기( 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 $$" ; }
(어쨌든 여기서는 잠이 별 소용이 없습니다)